拖动按钮时ScrollView不滚动

Dan*_*laM 38 cocoa-touch uibutton uiscrollview ios ios-simulator

我有一个滚动视图,用于滚动它没有全部按钮.现在它确实如此,当拖动鼠标时(在模拟器上)没有任何反应(我认为因为按钮被推动).我怎么能做到这一点?

小智 96

这是因为发生UIButton在子视图UIScrollView(我假设按钮添加在你的情况下子视图)所跟踪的接触,而不是滚动视图.UIScrollView方法touchesShouldCancelInContentView是关键.根据其描述:"如果视图不是UIControl对象,则默认返回值为YES ;否则返回NO.",即对于UIControl对象(按钮),UIScrollView不尝试取消阻止滚动的触摸.

因此,允许滚动按钮:

  1. 确保UIScrollView属性canCancelContentTouches设置为YES.
  2. 当内容视图对象是a时返回的子类UIScrollView和重写,如下所示:touchesShouldCancelInContentViewYESUIButton
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
    if ( [view isKindOfClass:[UIButton class]] ) {
        return YES;
    }

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

  • @DanielaM如果这个奇妙的答案对你有所帮助,那么接受它会很好. (4认同)
  • 问题在iOS 8中再次出现,并且`touchesShouldCancelInContentView`不再起作用.但是,滚动有时只会卡住.不总是. (3认同)

pug*_*gia 10

我创建了这个问题寻找这个问题的快速解决方案,我"翻译"它像这样:

class UIButtonScrollView: UIScrollView {

    override func touchesShouldCancel(in view: UIView) -> Bool {
        if view.isKind(of: UIButton.self) {
          return true
        }

        return super.touchesShouldCancel(in: view)
    }    
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助


Gre*_*egg 6

Swift 3解决方案

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