2013-07-17 58 views
13

我有UIScrollView加载了UIButtonsUIButton我已经突出显示UIImage的每个UIButtonUIScrollview delaysContentTouches问题

如果我不设置delaysContentTouchesNO如果我碰了UIButton非常快的UIButtonUIImage不会出那么突出。在我设置delaysContentTouches属性为NO之后,只有UIButton突出显示UIImage显示。

现在设置delaysContentTouches属性为UIScrollView的NO。拖动UIButtons我无法滚动我的UIScrollView。现在我该如何解决这个问题。

请给我一个建议。

在此先感谢。

+3

的delaysContentTouches意味着滚动视图总是会首先得到触摸,并决定是否进行滚动,或者不考虑如果滑动上。第一个测试是您看到的延迟,当您将此属性设置为NO时,您说您不希望滚动视图首先触摸,但所有子视图都应该接受触摸.... –

+0

如果按钮是真的很小,然后不滚动那个按钮可以工作。如果你有一个非常大的按钮,但仍然希望按钮先触摸按钮,但当你滑动手指时仍然滚动,那么我唯一能想到的做法就是添加一个手势识别器,用于滑动错误刷卡。手势识别器会覆盖触摸事件,当您调用手势的方法时,只需重新设置滚动视图的内容即可。我没有试过这个,所以我不知道它是否会工作.... –

+0

我可以做一些事情,当我长时间触摸我的按钮,然后我的触摸传递给下面的滚动视图。可能吗?或者我怎么能做到这一点? –

回答

5

OK我已经通过实施以下方法解决:

- (BOOL)touchesShouldCancelInContentView:(UIView *)view 
{ 
    NSLog(@"touchesShouldCancelInContentView"); 

    if ([view isKindOfClass:[UIButton class]]) 
     return NO; 
    else 
     return YES; 
} 
+0

不幸的是我不工作(我没有设置scrollviews委托) – Chris

+0

好吧,它工作,如果你的子类uiscrollview(这不是一个委托方法),并反转上面的NO/YES值。 – Chris

+0

首先,如果视图是UIButton,则返回YES。 “NO”已经是默认行为。其次,它应该在else子句中返回'[super touchesShouldCancelInContentView:view]'。 – devios1

2

无法在网上找到一个满意的解决方案为止(这似乎是苹果忽略的问题)。在Apple的开发人员论坛上发现一个线索,并提供一些建议,可能有所帮助:UIScrollView: 'delaysContentTouches' ignored

我能够使用此链接的解决方法。总结解决方法(我在这里是对齐引用):

UIEvent对象包含一个时间戳记。

您可以在touchesBegan时刻记录您的 嵌入式子视图的时间戳。

在touches移动scrollView的子视图时,再次查看时间戳和 位置。

如果触摸没有移动很远,比如说0.1秒 已经过去了,则可以假定用户触摸了子视图,然后再延迟移动 。

在这种情况下,UIScrollView将独立决定 这不是一个滚动操作,即使它永远不会告诉你 那个。

所以,你可以有一个状态变到标志 延迟运动的这种情况发生,并通过子视图接收处理事件。

这里是我的代码:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    // store the timestamp 
    _beginDragTimeStamp = event.timestamp;  

    // your embedded subview's touches begin code 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 
    // compare and ignore drag if time passed between tap and drag is less than 0.5s 
    if(event.timestamp - _beginDragTimeStamp < 0.5) return; 

    // your drag code 
} 
26

下面是我的作品。 UIScrollView的子类,并实现只有这个方法:

- (BOOL)touchesShouldCancelInContentView:(UIView *)view { 
    return YES; 
} 

然后设置delaysContentTouches = NO;

瞧!工作就像在主屏幕上:亮点立刻按钮,但仍允许滚动:)

+1

这适用于我,谢谢! – benck

+0

谢谢Chris,这是唯一可行的解​​决方案。 – Andy

+0

这为我工作。下面的其他解决方案没有(与tableView.delaysContentTouches =是结合) –

8

我发现,在iOS版8,UIScrollView的基本UIPanGestureRecognizer不尊重UIScrollView的delaysContentTouches财产。我认为这是一个iOS 8的错误。这里是我的解决办法:在同一的UITableViewCell

设置delaysContentTouches为NO的UIButton:

theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches 
+0

我相信你的意思theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches; 它帮助了我,谢谢你!我希望它打破别的东西。 – Lope

+0

谢谢。你是对的。我的意思是PanGestureRecognizer的delaysTouchesBegan属性应该反映UIScrollView的delaysContentTouches属性。供参考; – lifjoy

+0

供参考;我向苹果公司提交了一份雷达缺陷报告,并将其标记为重复。 – lifjoy

0

我有同样的问题&相同的看法层次,随着最新的SDK,只是使用它。

self.scrollview.delaysContentTouches = NO