触摸UISlider可防止滚动UIScrollView

时间:2012-06-12 20:33:04

标签: objective-c cocoa-touch uiscrollview uislider

我在UIScrollview中有一个(垂直)UISlider。我希望能够更改滑块的值,并且无需抬起手指,向左或向右滚动滚动视图。

所需行为

触摸垂直UISlider内部,然后向左或向右拖动手指导致滚动视图滚动

实际行为:

触摸垂直UISlider内部,然后向左或向右拖动手指导致UIScrollview中没有移动。触摸外部 UISlider,然后拖动将按预期滚动滚动视图

UIView有一个名为exclusiveTouch的属性,好像它可能与我的问题有关。我尝试将它设置为NO,没有运气。

那么,如何设置我的UISliders以便它们下方的滚动视图能够响应源自UISliders的触摸?

5 个答案:

答案 0 :(得分:5)

您是否尝试过继承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仅滚动水平。如果这不起作用,您可能需要对touchesBegan:withEvent:touchesChanged:withEvent:进行自定义触摸处理(即覆盖UIScrollViewUISlider等)

答案 1 :(得分:2)

您所看到的是预期的行为。

每个触摸事件仅由一个控件处理。 exclusiveTouch的作用实际上是阻止其他触摸事件传递到其他视图。

要做正在尝试做的事情,你必须自己做一些触摸处理。将事件传递给您的两个视图。您可以通过实现所有touchesBegan:touchesMoved:等方法来执行此操作,并将事件传递给两个视图。您可以在UIResponder documentation中详细了解该方法。另一种方法是在滚动视图上的UIGestureRecognizer中进行事件处理,测试滑块并使用y-delta更新滑块的值。您可以在the section about Gesture Recognizers in the Event Handling Guide for iOS中阅读有关手势识别器和事件处理的更多信息。


旁注

转到“设置”应用并在中途切换开关(例如飞行模式切换),然后向下拖动。什么都不会发生。操作系统的其余部分表现相同。你确定这是你真正想做的互动吗?行为不同的应用程序通常会感到奇怪和不熟悉。

答案 2 :(得分:1)

你的问题让我感到困惑。你是说一个垂直滑块 - 但是左右拖动?

如果您希望在拖动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);
}

希望这就是你想要的。

答案 3 :(得分:1)

您需要将delaysContentTouches设置为NO并阻止UISlider对象滚动,请检查以下代码。

mySlider.delaysContentTouches = NO;

- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view {
    if ([view isKindOfClass:[UISlider class]])
    {
        UITouch *touchEvent = [[event allTouches] anyObject];
        CGPoint locationEvent = [touchEvent locationInView:view];
        CGRect thumbRect;
        UISlider *mySlide = (UISlider*) view;
        CGRect trackRect = [mySlide trackRectForBounds:mySlide.bounds];
        thumbRect = [mySlide thumbRectForBounds:mySlide.bounds trackRect:trackRect value:mySlide.value];
        if (CGRectContainsPoint(thumbRect, locationEvent))
            return YES;
    }
    return NO;
}

答案 4 :(得分:0)

我认为您可以从this示例中获得一些参考,在此示例中显示了如何取消任何触摸或任何手势识别器并将其应用于其他视图。

这可以引导您解决问题,如果只是让我知道它

Happy Codding:)