ScrollView not scrolling when dragging on buttons

前端 未结 5 1957
暖寄归人
暖寄归人 2020-11-29 18:17

I have a scroll view that used to scroll when it didn\'t have buttons all over it. Now it does, and when dragging the mouse (on simulator) nothing happens (i think because t

相关标签:
5条回答
  • 2020-11-29 18:49

    One thing to try if you're seeing this in a simulator is to run on an actual phone. I couldn't scroll in the simulator but no prob on my phone.

    0 讨论(0)
  • 2020-11-29 18:53

    This is happening because UIButton subviews of the UIScrollView (I assume buttons are added as subviews in your case) are tracking the touches and not the scroll view. UIScrollView method touchesShouldCancelInContentView is the key here. According to its description: "The default returned value is YES if view is not a UIControl object; otherwise, it returns NO.", i.e. for UIControl objects (buttons), UIScrollView does not attempt to cancel touches which prevents scrolling.

    So, to allow scrolling with buttons:

    1. Make sure UIScrollView property canCancelContentTouches is set to YES.
    2. Subclass UIScrollView and override touchesShouldCancelInContentView to return YES when content view object is a UIButton, like this:
    - (BOOL)touchesShouldCancelInContentView:(UIView *)view
    {
        if ( [view isKindOfClass:[UIButton class]] ) {
            return YES;
        }
    
        return [super touchesShouldCancelInContentView:view];
    }
    
    0 讨论(0)
  • 2020-11-29 18:54

    Swift 3 Solution

    override func touchesShouldCancel(in view: UIView) -> Bool {
        if view is UIButton {
            return true
        }
        return super.touchesShouldCancel(in: view)
    }
    
    0 讨论(0)
  • 2020-11-29 18:59

    I founded this question looking for the swift solution for this problem, I "translated" it like this:

    Swift 5

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

    hope this could help

    0 讨论(0)
  • 2020-11-29 19:06

    In my case, I solved it with this way.

    in ViewDidLoad

    self.scrollView.panGestureRecognizer.delaysTouchesBegan = self.scrollView.delaysContentTouches;
    

    in .m

    - (BOOL)touchesShouldCancelInContentView:(UIView *)view {
        if ([view isKindOfClass:[UIControl class]]) return YES;
        return NO;
    }
    
    0 讨论(0)
提交回复
热议问题