在UIScrollView中,UIButton触摸会延迟

Jef*_*eff 49 uibutton uiscrollview ios touchescancelled

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

我基本上有一系列UIButtons添加为子视图,UIScrollView它是一个笔尖的一部分.每次按下按钮,按钮突出显示之前都会有明显的延迟.在按钮变暗并显示选中之前,我基本上必须按住它约半秒钟.

我假设这是因为UIScrollView需要确定触摸是否是滚动或者是否是针对子视图的触摸.

无论如何,我对如何进行有点不确定.我只想让按钮在点击它时立即显示.

任何帮助表示赞赏!

编辑:

我已经尝试设置delaysContentTouchesNO但滚动变得几乎不可能,因为我的大部分scrollView都被填充UIButtons.

jlo*_*g64 50

杰夫的解决方案并不适合我,但这个类似的解决方案:http://charlesharley.com/2013/programming/uibutton-in-uitableviewcell-has-no-highlight-state

除了覆盖touchesShouldCancelInContentView滚动视图子类之外,您仍需要设置delaysContentTouchesfalse.最后,您需要返回true而不是false按钮.以下是上述链接的修改示例.正如评论者建议的那样,它会检查任何子类UIControl而不是UIButton特定的子类,以便此行为适用于任何类型的控件.

Objective-C的:

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.delaysContentTouches = false;
    }

    return self;
}

- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
    if ([view isKindOfClass:UIControl.class]) {
        return true;
    }

    return [super touchesShouldCancelInContentView:view];
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特4:

override func touchesShouldCancel(in view: UIView) -> Bool {
    if view is UIControl {
        return true
    }
    return super.touchesShouldCancel(in: view)
}
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,而不是接受的答案.谢谢. (3认同)
  • 优秀解决方案 如果您正在使用界面构建器,只需选择scrollView并在属性检查器中取消选中"延迟内容触摸". (3认同)
  • 如果视图是UIControl甚至更好 (3认同)
  • 测试了iOS 8上发布的所有解决方案.只有这一个可以防止按钮上的触摸延迟并且不会干扰滚动. (2认同)
  • **这是解决方案**.您可以获得类似跳板效果(触摸动画可以在没有任何延迟的情况下提前开始,但如果您仍然决定滚动则取消). (2认同)

Jef*_*eff 41

好的,我已经通过子类化UIScrollView和覆盖解决了这个问题touchesShouldCancelInContentView

现在我的UIButton那个被正确地标记为99个亮点,我的滚动视图正在滚动!

myCustomScrollView.h:

@interface myCustomScrollView : UIScrollView  {

}

@end
Run Code Online (Sandbox Code Playgroud)

myCustomScrollView.m:

@implementation myCustomScrollView

    - (BOOL)touchesShouldCancelInContentView:(UIView *)view
    {
        NSLog(@"touchesShouldCancelInContentView");

        if (view.tag == 99)
            return NO;
        else 
            return YES;
    }
Run Code Online (Sandbox Code Playgroud)

  • 哇,我刚刚看到这个答案,它彻底解决了我遇到的问题.希望我能给你+1000分!非常感谢. (6认同)

Vla*_*mir 26

尝试将UIScrollView delaysContentTouches属性设置为NO.