ios 8 – buttons in horizontal scroll view intercepting pan event – scroll does not work

I have a horizontal scroll view with a line of buttons. The scroll view will not scroll unless I do an extremely fast swipe.

If I set the buttons to userInteractionEnabled = NO, then the scrolling works as expected, but of course, then the buttons don’t work at all.

  • scrollViewWillEndDragging:withVelocity:targetContentOffset: not working on the edges of a UISCrollView
  • Auto layout UIScrollView with subviews with dynamic heights
  • Why is UIScrollView leaving space on top and does not scroll to the bottom
  • UIScrollView zooming with Auto Layout
  • How I auto size a UIScrollView to fit the content
  • Autolayouts in UIScrollView using Cirrious.FluentLayouts.Touch
  • This app worked fine in iOS 7 and before. It seems to be a iOS 8 “feature”. I did notice that I can catch the button’s drag event, but I don’t know how to redirect it back to the scrollView.

    I’m thinking I’ll need to replace my buttons with UIViews and manage the events myself but I’d be grateful if someone has other ideas or solutions.

    5 Solutions Collect From Internet About “ios 8 – buttons in horizontal scroll view intercepting pan event – scroll does not work”

    I found that in iOS 8, the UIScrollView’s underlying UIPanGestureRecognizer is not respecting the UIScrollView’s delaysContentTouches property. I consider this an iOS 8 bug. Here’s my workaround:

    theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches
    

    I’ve had this problem with a UITableView which has custom UITableViewCells with UIButtons on it. I put this in my UITableview class.

    - (BOOL)touchesShouldCancelInContentView:(UIView *)view {
        return YES;
    }
    

    Solved my problem.

    EDIT: Just to clearify, you can create a subclass of UIScrollview and add this to solve the problem.

    This hack works for me:

    UITapGestureRecognizer *nothingTap = [[UITapGestureRecognizer alloc] init];
    nothingTap.delaysTouchesBegan = YES;
    [_scrollView addGestureRecognizer:nothingTap];
    

    credit: https://devforums.apple.com/thread/241467

    I made a subclass of UIScrollView to fix this issue. You only need this method in it:

    - (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view
    {
        UITouch *touch = [touches anyObject];
    
        if(touch.phase == UITouchPhaseMoved)
        {
            return NO;
        }
        else
        {
            return [super touchesShouldBegin:touches withEvent:event inContentView:view];
        }
    }
    

    Then just remember to set the class to your subclass in the storyboard if you’re using one and you’re good to go.

    I have same issue and I solved it by creating a subclass of UIScrollView and set it’s cancelContentTouches value to TRUE and its working fine.

    - (BOOL)touchesShouldCancelInContentView:(UIView *)view {
           return YES;
    }
    

    Hope it will work for you.