我在UIScrollview中有一个(垂直)UISlider。我希望能够更改滑块的值,并且无需抬起手指,向左或向右滚动滚动视图。
所需行为
触摸垂直UISlider内部,然后向左或向右拖动手指导致滚动视图滚动
实际行为:
触摸垂直UISlider内部,然后向左或向右拖动手指导致UIScrollview中没有移动。触摸外部 UISlider,然后拖动将按预期滚动滚动视图
UIView有一个名为exclusiveTouch的属性,好像它可能与我的问题有关。我尝试将它设置为NO,没有运气。
那么,如何设置我的UISliders以便它们下方的滚动视图能够响应源自UISliders的触摸?
答案 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:
进行自定义触摸处理(即覆盖UIScrollView
,UISlider
等)
答案 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)