我有加载UIScrollView
的UIButtons
和UIButton
行动我突出了每个UIImage
的UIButton
。
如果我没有将delaysContentTouches
设置为NO
那么突出显示UIImage
的UIButton
将不会显示如果我非常快地触及UIButton
。在我将delaysContentTouches
属性设置为NO
后,只有UIButton
突出显示UIImage
。
现在将delaysContentTouches
属性设置为UIScrollView
的NO。我不能通过拖动UIScrollView
来滚动我的UIButtons
。现在我该如何解决这个问题。
请给我一个建议。
提前致谢。
这对我有用。子类UIScrollView,并只实现此方法:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
return YES;
}
然后设置delaysContentTouches = NO;
瞧!像主屏幕一样工作:立即突出显示按钮,但仍允许滚动:)
我发现在iOS 8中,UIScrollView的底层UIPanGestureRecognizer不尊重UIScrollView的delaysContentTouches属性。我认为这是iOS 8的错误。这是我的解决方法:
theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches
好的我通过实现以下方法解决了:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
NSLog(@"touchesShouldCancelInContentView");
if ([view isKindOfClass:[UIButton class]])
return NO;
else
return YES;
}
到目前为止,无法在网上找到满意的解决方案(似乎苹果忽略了这个问题)。在Apple的开发者论坛上找到了一个主题,其中有一些建议可能有所帮助:UIScrollView: 'delaysContentTouches' ignored
我能够使用此链接中的解决方法。总结一下解决方法(我在这里引用):
UIEvent对象包含时间戳。
您可以在嵌入式子视图中记录touchesBegan时的时间戳。
在scrollView的子视图的touchesMoved中,再次查看时间戳和位置。
如果触摸没有移动很远且超过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
}
我有相同的问题和相同的视图层次结构,使用最新的sdk,只需使用它:
在同一个UITableViewCell中为UIButton设置delayedContentTouches为NO。
self.scrollview.delaysContentTouches = NO
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
if ([view isKindOfClass:UIButton.class]) {
return YES;
}
return [super touchesShouldCancelInContentView:view];
}
Delay Touch Down
或在代码中设置delaysContentTouches = NO
。