ios 8 - 水平滚动视图中的按钮拦截平移事件 - 滚动不起作用

时间:2014-09-12 03:36:40

标签: ios uiscrollview uibutton ios8

我有一个带有一行按钮的水平滚动视图。除非我进行极快速的滑动,否则滚动视图不会滚动。

如果我将按钮设置为userInteractionEnabled = NO,则滚动按预期工作,但当然按钮根本不起作用。

此应用在iOS 7及以前版本中运行良好。它似乎是iOS 8"功能"。我注意到我可以抓住按钮的拖动事件,但我不知道如何将其重定向回scrollView。

我认为我需要用UIViews替换我的按钮并亲自管理这些活动,但如果有人有其他想法或解决方案,我将感激不尽。

5 个答案:

答案 0 :(得分:39)

我发现在iOS 8中,UIScrollView的底层UIPanGestureRecognizer不遵守UIScrollView的delaysContentTouches属性。我认为这是iOS 8的错误。这是我的解决方法:

theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches

答案 1 :(得分:24)

我在UITableView上遇到了这个问题,它有自定义UITableViewCells和UIButtons。我把它放在我的UITableview类中。

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

解决了我的问题。

编辑:要清除,您可以创建UIScrollview的子类并添加它来解决问题。

答案 2 :(得分:10)

这个黑客对我有用:

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

信用:https://devforums.apple.com/thread/241467

答案 3 :(得分:8)

我创建了UIScrollView的子类来解决此问题。你只需要这个方法:

- (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];
    }
}

然后只需记住在故事板中将类设置为子类,如果您正在使用它,那么您就可以了。

答案 4 :(得分:0)

我有同样的问题,我通过创建UIScrollView的子类并将其cancelContentTouches值设置为TRUE并且工作正常来解决它。

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

希望它对你有用。