【问题标题】:ScrollView not scrolling when dragging on buttons拖动按钮时ScrollView不滚动
【发布时间】:2011-03-31 13:34:39
【问题描述】:

我有一个滚动视图,当它上面没有按钮时会滚动。现在确实如此,并且当拖动鼠标(在模拟器上)时,什么也没有发生(我认为是因为按钮被按下了)。我怎样才能做到这一点?

【问题讨论】:

  • 你在物理设备上试过了吗,设备和模拟器有几个区别,鼠标和多点触控是最大的之一!

标签: ios cocoa-touch uiscrollview uibutton ios-simulator


【解决方案1】:

发生这种情况是因为UIScrollViewUIButton 子视图(我假设在您的情况下按钮被添加为子视图)正在跟踪触摸而不是滚动视图。 UIScrollView 方法 touchesShouldCancelInContentView 是这里的关键。根据其描述:“如果视图不是UIControl对象,则默认返回值为YES;否则返回NO。”,即对于UIControl对象(按钮),UIScrollView不会尝试取消防止滚动的触摸。

所以,要允许使用按钮滚动:

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

    return [super touchesShouldCancelInContentView:view];
}

【讨论】:

  • 感谢您的回答。我更改了具有图像的滚动条以模拟按钮(并跟踪触摸以了解何时调用方法)我会尝试您的解决方案并看看它是如何工作的。谢谢!
  • @DanielaM 如果这个奇妙的答案确实对您有所帮助,那么接受它会很好。
  • 它仍然对我不起作用。 touchesShouldCancelInContentView 永远不会被调用,除非我将延迟设置为 NO,但在后一种情况下,根本没有滚动。
  • 我添加了一个例子。请注意,我实际上会检查 UIControl 而不是 UIButton,以防在某些时候出现滑块、步进器或开关。
  • 问题在 iOS 8 中再次存在,touchesShouldCancelInContentView 不再起作用。但是,滚动只是有时会卡住。并非总是如此。
【解决方案2】:

我创建这个问题是为了寻找这个问题的快速解决方案,我这样“翻译”它:

斯威夫特 5

class UIButtonScrollView: UIScrollView {

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

        return super.touchesShouldCancel(in: view)
    }    
}

希望这会有所帮助

【讨论】:

  • 像魅力一样工作?
【解决方案3】:

Swift 3 解决方案

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

【讨论】:

    【解决方案4】:

    如果您在模拟器中看到此内容,可以尝试在实际手机上运行。我无法在模拟器中滚动,但手机上没有问题。

    【讨论】:

    • 你是对的。但这太奇怪了。你知道会发生什么吗?
    • @flopshot 抱歉,除了模拟器错误之外没有任何线索。不确定普通用户是否可以修复。
    【解决方案5】:

    就我而言,我用这种方式解决了它。

    在 ViewDidLoad 中

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

    .m

    - (BOOL)touchesShouldCancelInContentView:(UIView *)view {
        if ([view isKindOfClass:[UIControl class]]) return YES;
        return NO;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      相关资源
      最近更新 更多