UIScrollview delayedContentTouches问题

时间:2013-07-17 13:38:16

标签: ios objective-c cocoa-touch uiscrollview

我已UIScrollView加载了UIButtons,并且在UIButton行动中,我突出显示了每个UIImage的{​​{1}}。

如果我没有将UIButton设置为delaysContentTouches,那么如果我非常快地修改NO,则UIImage的突出显示UIButton将不会显示。将UIButton属性设置为delaysContentTouches后,只显示NO突出显示的UIButton

现在为UIImage设置delaysContentTouches属性为NO后。我无法通过拖动UIScrollView来滚动UIScrollView。现在我该如何解决这个问题。

请给我一个建议。

提前致谢。

6 个答案:

答案 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)

  1. 创建UIScrollView的子类(或UITableView或UICollectionView或您使用的任何其他UIScrollView子类)。

  2. 实施以下方法:

    - (BOOL)touchesShouldCancelInContentView:(UIView *)view {
    
         if ([view isKindOfClass:UIButton.class]) {
    
              return YES;
         }
    
         return [super touchesShouldCancelInContentView:view];
    }
    
  3. 如果使用界面生成器,则将xib / storyboard上的此子类设置为“自定义类”类。

  4. 在xib中取消选择Delay Touch Down或在代码中设置delaysContentTouches = NO