【问题标题】:ios 8 - buttons in horizontal scroll view intercepting pan event - scroll does not workios 8 - 水平滚动视图中的按钮拦截平移事件 - 滚动不起作用
【发布时间】:2014-11-06 03:54:25
【问题描述】:

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

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

此应用在 iOS 7 及之前的版本中运行良好。这似乎是 iOS 8 的“功能”。我确实注意到我可以捕获按钮的拖动事件,但我不知道如何将其重定向回滚动视图。

我想我需要用 UIViews 替换我的按钮并自己管理事件,但如果有人有其他想法或解决方案,我将不胜感激。

【问题讨论】:

  • 我还没有解决方案,但我只是注意到我有完全相同的问题。当我找到一个解决方案时会发布一个解决方案。
  • FWIW,我将按钮改写为 UILabel,并使用 UITapGestureRecognizer 进行管理。 Apple 论坛上有一些关于 iOS8 beta 类别下的这个 bug 的 cmet。
  • 糟糕,我确实找到了解决方案,但忘记发帖了。如果您想简化您所做的事情,将发布一些 UIScrollView 子类。

标签: ios uiscrollview uibutton ios8


【解决方案1】:

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

theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches

【讨论】:

  • 修复工作,但存在一个问题:当用户将手指放在按钮上时,“突出显示”的按钮图像不显示。
  • 非常感谢您的回答。
  • 绝对是我见过的最清晰的解决方案……谢谢!
【解决方案2】:

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

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

解决了我的问题。

编辑:为了明确起见,您可以创建 UIScrollview 的子类并添加它来解决问题。

【讨论】:

  • 这似乎是正确的解决方案。尝试了 touchShouldBegin: 方法,但始终无法识别按钮点击(如莱昂纳多所述)
  • 这是最好的解决方案。
  • 让我头疼不已,谢谢!这适用于 iOS 5.1 及更高版本。
【解决方案3】:

这个技巧对我有用:

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

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

【讨论】:

  • 谢谢!像魅力一样工作 - 拯救了我的一天!
  • 如果您不必支持 iOS 5.1,则此方法有效。 Daniel 的解决方案对我来说是全面的。
【解决方案4】:

我创建了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];
    }
}

然后,如果您正在使用,请记住在情节提要中将类设置为您的子类,并且一切顺利。

【讨论】:

  • 这解决了我的问题。谢谢!
  • 也修复了我的问题——在滚动视图中嵌入了 UISegmentedControl。非常感谢!
  • 我试过了,它修复了 UIScrollView,但有时我的按钮在第一次触摸时没有响应,有没有其他人注意到同样的行为?
  • @Leonardo 是的,注意到同样的事情 - 所以上面的解决方案并没有真正解决问题。可能不得不将所有按钮更改为视图。
【解决方案5】:

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

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

希望它对你有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多