触摸UISlider可防止滚动UIScrollView
我在UIScrollview中有一个(垂直)UISlider。 我希望能够更改滑块的值,并且在不抬起手指的情况下向左或向右滚动滚动视图。
期望的行为:
向下触摸垂直UISlider内部,然后向左或向右拖动手指使滚动视图滚动
实际行为:
向下触摸垂直UISlider内部,然后向左或向右拖动手指不会在UIScrollview中移动。 在UISlider之外触摸,然后拖动将按预期滚动滚动视图
UIView有一个名为exclusiveTouch的属性,看起来好像它可能与我的问题有关。 我尝试将它设置为NO,但没有运气。
那么,如何设置我的UISliders,以便它们下面的滚动视图能够响应UISliders内部产生的触摸?
你有没有尝试- (BOOL)touchesShouldCancelInContentView:(UIView *)view
UIScrollView
并实现- (BOOL)touchesShouldCancelInContentView:(UIView *)view
? 根据Apple文档:
// called before scrolling begins if touches have already been delivered to a subview of the scroll view. if it returns NO the touches will continue to be delivered to the subview and scrolling will not occur
// not called if canCancelContentTouches is NO. default returns YES if view isn't a UIControl
如果你只是返回NO
如果view
是你的UISlider
,这可能做你想做的,假设你的UIScrollView
只能水平滚动。 如果这不起作用,您可能必须为您的UIScrollView
和您的UISlider
执行自定义触摸处理(即覆盖touchesBegan:withEvent:
, touchesChanged:withEvent:
等)。
你所看到的是预期的行为。
每个触摸事件只能由一个控件处理。 什么exclusiveTouch
做的实际上是防止其他触摸事件被传递到其他视图。
要做你想做的事情,你必须自己做一些触摸操作。 将活动传递给您的观点。 你可以通过实现所有的touchesBegan:
, touchesMoved:
等方法来做到这一点,并将事件传递给两个视图。 您可以在UIResponder文档中阅读有关该方法的更多信息。 另一种方法是在滚动视图上的UIGestureRecognizer中执行事件处理,该命令用于测试滑块并使用y-delta更新滑块的值。 有关手势识别器和事件处理的更多信息,请参阅iOS事件处理指南中有关手势识别器的部分。
边注:
转到设置应用程序并切换一半开关(例如飞行模式切换),然后向下拖动。 什么都不会发生。 其他操作系统的行为方式相同。 你确定这是你真正想要做的互动吗? 行为不同的应用程序通常会感到奇怪和陌生。
你的问题让我困惑了一下。 你说的是垂直滑块 - 但左右拖动?
如果您希望在拖动UISlider时滚动滚动视图,则正确的方法是
[mySlider addTarget:self action:@selector(sliderMoved:) forControlEvents:UIControlEventValueChanged];
和
- (void) sliderMoved:(UISlider*) slider {
myScrollView.contentOffset.x = slider.value * (myScrollView.contentSize.width - myScrollView.bounds.size.width);
}
希望这是你想要的。
链接地址: http://www.djcxy.com/p/44263.html上一篇: Touch on UISlider prevents scrolling of UIScrollView
下一篇: How to make a UIView ignore touches without releasing it?