10

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

期望的行为:

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

实际行为:

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

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

那么,如何设置我的 UISlider 以便它们下方的滚动视图将响应源自 UISlider 内部的触摸?

4

5 回答 5

5

您是否尝试过子类化UIScrollView和实施- (BOOL)touchesShouldCancelInContentView:(UIView *)view?根据苹果文档:

// 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

如果你只是返回NOif the viewis your UISlider,这可能会做你想要的,假设你UIScrollView只水平滚动。如果这不起作用,您可能必须touchesBegan:withEvent:touchesChanged:withEvent:您的UIScrollView和您的UISlider.

于 2012-06-18T04:27:07.900 回答
2

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

每个触摸事件仅由一个控件处理。这样做exclusiveTouch实际上是为了防止其他触摸事件被传递到其他视图。

要做你想做的事情,你必须自己做一些触摸处理。将事件传递给您的两个视图。touchesBegan:您可以通过实现所有等方法来做到这一点,touchesMoved:并将事件传递给两个视图。您可以在UIResponder 文档中阅读有关该方法的更多信息。另一种方法是在滚动视图上的 UIGestureRecognizer 中进行事件处理,以测试滑块并使用 y-delta 更新滑块的值。您可以在 iOS 的事件处理指南中有关手势识别器的部分中阅读有关手势识别器和事件处理的更多信息。


旁注

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

于 2012-06-14T21:29:14.723 回答
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);
}

希望这是你想要的。

于 2012-06-15T01:38:57.540 回答
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;
}
于 2017-08-08T14:13:53.557 回答
0

我想你可以从这个例子中得到一些参考,在这个例子中它展示了如何取消任何触摸或任何手势识别器并将它们应用于其他视图。

愿这能引导你解决你的问题,如果它会让我知道

快乐编码:)

于 2012-06-18T07:32:47.187 回答