【发布时间】:2011-03-31 13:34:39
【问题描述】:
我有一个滚动视图,当它上面没有按钮时会滚动。现在确实如此,并且当拖动鼠标(在模拟器上)时,什么也没有发生(我认为是因为按钮被按下了)。我怎样才能做到这一点?
【问题讨论】:
-
你在物理设备上试过了吗,设备和模拟器有几个区别,鼠标和多点触控是最大的之一!
标签: ios cocoa-touch uiscrollview uibutton ios-simulator
我有一个滚动视图,当它上面没有按钮时会滚动。现在确实如此,并且当拖动鼠标(在模拟器上)时,什么也没有发生(我认为是因为按钮被按下了)。我怎样才能做到这一点?
【问题讨论】:
标签: ios cocoa-touch uiscrollview uibutton ios-simulator
发生这种情况是因为UIScrollView 的UIButton 子视图(我假设在您的情况下按钮被添加为子视图)正在跟踪触摸而不是滚动视图。 UIScrollView 方法 touchesShouldCancelInContentView 是这里的关键。根据其描述:“如果视图不是UIControl对象,则默认返回值为YES;否则返回NO。”,即对于UIControl对象(按钮),UIScrollView不会尝试取消防止滚动的触摸。
所以,要允许使用按钮滚动:
UIScrollView 属性canCancelContentTouches 设置为YES。 UIButton 时,子类UIScrollView 并覆盖touchesShouldCancelInContentView 以返回YES,如下所示:- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
if ( [view isKindOfClass:[UIButton class]] ) {
return YES;
}
return [super touchesShouldCancelInContentView:view];
}
【讨论】:
UIControl 而不是 UIButton,以防在某些时候出现滑块、步进器或开关。
touchesShouldCancelInContentView 不再起作用。但是,滚动只是有时会卡住。并非总是如此。
我创建这个问题是为了寻找这个问题的快速解决方案,我这样“翻译”它:
斯威夫特 5
class UIButtonScrollView: UIScrollView {
override func touchesShouldCancel(in view: UIView) -> Bool {
if view.isKind(of: UIButton.self) {
return true
}
return super.touchesShouldCancel(in: view)
}
}
希望这会有所帮助
【讨论】:
Swift 3 解决方案
override func touchesShouldCancel(in view: UIView) -> Bool {
if view is UIButton {
return true
}
return super.touchesShouldCancel(in: view)
}
【讨论】:
如果您在模拟器中看到此内容,可以尝试在实际手机上运行。我无法在模拟器中滚动,但手机上没有问题。
【讨论】:
就我而言,我用这种方式解决了它。
在 ViewDidLoad 中
self.scrollView.panGestureRecognizer.delaysTouchesBegan = self.scrollView.delaysContentTouches;
.m
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
if ([view isKindOfClass:[UIControl class]]) return YES;
return NO;
}
【讨论】: