在UIScrollView中,UIButton touch会延迟

我在我的应用程序中遇到了一个小问题。

我基本上有一系列的UIButtons作为子UIScrollView的一部分UIScrollView添加为子视图。 每次点击一个button,在button被突出显示之前,都会有明显的延迟。 我基本上必须在button变暗并显示选定之前保持约半秒。

我假设这是因为UIScrollView需要确定触摸是滚动还是触摸是为子视图。

无论如何,我有点不确定如何进行。 我只是希望button出现被选中,只要我点击它。

任何帮助表示赞赏!

编辑:

我已经尝试将delaysContentTouches设置为NO,但滚动几乎是不可能的,因为我的scrollView的大部分是充满了UIButtons

好吧,我已经通过touchesShouldCancelInContentView UIScrollView并重写touchesShouldCancelInContentView

现在我的UIButton被标记为99高亮正确,我的滚动视图正在滚动!

myCustomScrollView.h

 @interface myCustomScrollView : UIScrollView { } @end 

myCustomScrollView.m

 @implementation myCustomScrollView - (BOOL)touchesShouldCancelInContentView:(UIView *)view { NSLog(@"touchesShouldCancelInContentView"); if (view.tag == 99) return NO; else return YES; } 

杰夫的解决scheme不是为我工作,但类似的一个: http : //www.charlesharley.com/2013/programming/uibutton-in-uitableviewcell-has-no-highlight-state/

不知道是否这是杰夫的答案,但除了覆盖-touchesShouldCancelInContentView:在你的滚动视图子类,你仍然需要设置delaysContentTouchesNO 。 最后,不要为你的button返回NO ,你需要返回YES 。 以上链接为例。

 - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { self.delaysContentTouches = NO; } return self; } - (BOOL)touchesShouldCancelInContentView:(UIView *)view { if ([view isKindOfClass:UIButton.class]) { return YES; } return [super touchesShouldCancelInContentView:view]; } 

Swift版本。

 override func touchesShouldCancelInContentView(view: UIView!) -> Bool { if view is UIButton { return true } return super.touchesShouldCancelInContentView(view) } 

尝试将UIScrollView的delaysContentTouches属性设置为NO。

现有的解决scheme都不适合我。 也许我的情况更加独特。

我有一个UIScrollView许多UIButtons 。 当一个UIButton被按下时,一个新的UIViewController被呈现给用户。 如果按一个button并保持足够长的时间,button将显示其按下的状态。 我的客户抱怨说,如果你点击的太快,没有显示压低的状态。

我的解决scheme:在UIButtons的tap方法中,我加载新的UIViewController并将其呈现在屏幕上,我使用

 [self performSelector:@selector(loadNextScreenWithOptions:) withObject:options afterDelay:0.] 

这安排在下一个事件循环中加载下一个UIViewController 。 允许时间重绘UIButton 。 在加载下一个UIViewController之前, UIButton现在显示了它的低迷状态。

故事板解决scheme:select滚动视图,打开“属性检查器”,并取消选中“延迟内容接触”

在这里输入图像说明

Swift 3:

 scrollView.delaysContentTouches = false 

在Swift 3:

 import UIKit class ScrollViewWithButtons: UIScrollView { override init(frame: CGRect) { super.init(frame: frame) myInit() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) myInit() } private func myInit() { self.delaysContentTouches = false } override func touchesShouldCancel(in view: UIView) -> Bool { if view is UIButton { return true } return super.touchesShouldCancel(in: view) } } 

然后,您可以在IB或代码中使用此ScrollViewWithButtons