接触延迟开始

Posted

技术标签:

【中文标题】接触延迟开始【英文标题】:touchesBegan with delay 【发布时间】:2015-08-05 09:43:57 【问题描述】:

我有一个UIView 的子类,并添加了touchesBegantouchesEnd 方法...

touchesBegan 中,我使用self.backgroundColor = [UIColor greenColor]backgroundColor 从白色设置为绿色...在touchesEnd 中我将颜色重置为白色。

它可以工作,但速度很慢。通过点击视图,我需要 0.5 - 1.0 秒才能看到绿色。

UITableView 中选择一个单元格会快得多。

【问题讨论】:

hm,可能是由于设置背景颜色等属性时的隐式动画。你能检查一下触摸是迟到还是只是颜色的变化? 你的这个 UIView 恰好在 UITableView 或者 UIScrollView 里面? @Volker 想法不错,但UIKit 禁用了底层CALayers (see this great answer here) 的隐式动画,所以我想这不是问题所在。我会寻找超级视图的delaysContentTouches 或类似的东西。 @Thedude -> 是的,它是一个 UITableViewCell 我知道这已经是一个公认的答案,但我建议你试试这个:UITableViews 默认延迟内容触摸。它有一个名为 delaysContentTouches 的属性,您应该将其设置为 NO。 developer.apple.com/library/ios/documentation/UIKit/Reference/… 【参考方案1】:

试试这个:

self.view.userInteractionEnabled = YES;
    UILongPressGestureRecognizer *recognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(doCallMethod:)];
    recognizer.delegate = self;
    recognizer.minimumPressDuration = 0.0;
    [self.view addGestureRecognizer:recognizer];

- (void)doCallMethod:(UILongPressGestureRecognizer*)sender 
    if(sender.state == UIGestureRecognizerStateBegan)
        NSLog(@"Begin");
        self.view.backgroundColor = [UIColor greenColor];
    else if (sender.state == UIGestureRecognizerStateEnded)
        NSLog(@"End");
        self.view.backgroundColor = [UIColor whiteColor];
    

注意: 它会工作得更快。

【讨论】:

好的,但是如果我把我的新视图放在 UITableViewCell 中......我不能滑动单元格来查看删除按钮:-( 有效,但是如果视图位于 UIScrollView 类型的 superView 内... ScrollView 无法通过在 minimumDressDuration = 0.0 的视图内开始滚动来滚动...所以你必须调整它价值例如0.1 ... UIScrollView 能够滚动 为什么touchesBegan会有延迟?无论如何要加快速度?【参考方案2】:

您应该按照 TheBurgerShot 的建议使用手势识别器,但我建议您使用 UILongPressGestureRecognizer。比如:

UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(changeColor:)];
gesture.minimumPressDuration = 0.f;
[self.yourView addGestureRecognizer:gesture];

在您的viewDidLoad 中。并且:

-(void) changeColor:(UIGestureRecognizer *)gestureRecognizer

    if (gestureRecognizer.state == UIGestureRecognizerStateBegan)
        self.yourView.backgroundColor = [UIColor greenColor];
    
    else if (gestureRecognizer.state == UIGestureRecognizerStateEnded)
        self.yourView.backgroundColor = [UIColor whiteColor];
    

【讨论】:

你知道为什么touchesbegan会有一些延迟吗?使用手势可以解决问题,但不能像touches这样的属性都像多点触摸一样开始。

以上是关于接触延迟开始的主要内容,如果未能解决你的问题,请参考以下文章

学习EF之贪婪加载和延迟加载

如何延迟从页面加载开始显示Gif?

启用外设定时器和定时器实际开始计数之间是不是有延迟?这是啥延迟,是啥原因造成的?

为啥 MediaRecorder 延迟开始录制?

实现对象属性的lazy-loading(延迟加载)

如何消除 animateKeyframes 动画开始和结束的延迟 - Swift UIKit