我已UIScrollView
加载了UIButtons
,并且在UIButton
行动中,我突出显示了每个UIImage
的{{1}}。
如果我没有将UIButton
设置为delaysContentTouches
,那么如果我非常快地修改NO
,则UIImage
的突出显示UIButton
将不会显示。将UIButton
属性设置为delaysContentTouches
后,只显示NO
突出显示的UIButton
。
现在为UIImage
设置delaysContentTouches
属性为NO后。我无法通过拖动UIScrollView
来滚动UIScrollView
。现在我该如何解决这个问题。
请给我一个建议。
提前致谢。
答案 0 :(得分:35)
这对我有用。子类UIScrollView,并只实现此方法:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
return YES;
}
然后设置delaysContentTouches = NO;
瞧!与主屏幕一样工作:立即突出显示按钮,但仍允许滚动:)
答案 1 :(得分:9)
我发现在iOS 8中,UIScrollView的底层UIPanGestureRecognizer不遵守UIScrollView的delaysContentTouches属性。我认为这是iOS 8的错误。这是我的解决方法:
theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches
答案 2 :(得分:6)
好的我已经通过实施以下方法解决了:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
NSLog(@"touchesShouldCancelInContentView");
if ([view isKindOfClass:[UIButton class]])
return NO;
else
return YES;
}
答案 3 :(得分:2)
到目前为止,无法在网上找到满意的解决方案(似乎苹果忽略了这个问题)。在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
}
答案 4 :(得分:0)
我有同样的问题&amp;相同的视图层次结构,使用最新的sdk,只需使用它:
在同一个UITableViewCell中将UIDutton的delaysContentTouches设置为NO。
self.scrollview.delaysContentTouches = NO
答案 5 :(得分:0)
创建UIScrollView的子类(或UITableView或UICollectionView或您使用的任何其他UIScrollView子类)。
实施以下方法:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
if ([view isKindOfClass:UIButton.class]) {
return YES;
}
return [super touchesShouldCancelInContentView:view];
}
如果使用界面生成器,则将xib / storyboard上的此子类设置为“自定义类”类。
在xib中取消选择Delay Touch Down
或在代码中设置delaysContentTouches = NO
。