触摸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?