【问题标题】:performSelector:withObject:afterDelay: not working from scrollViewDidZoomperformSelector:withObject:afterDelay: 不能从 scrollViewDidZoom 工作
【发布时间】:2011-02-21 09:16:24
【问题描述】:

我觉得我应该知道这一点,但我已经被难住了好几个小时,而且我已经没有想法了。

原理很简单,用户在滚动视图中使用捏合来操作缩放和定位。如果他们在短时间内保持捏合,则滚动视图会记录缩放级别和内容偏移量。

所以我想我会在 scrollViewDidZoom 委托方法上启动 performSelector:withObject:withDelay。如果它过期,那么我记录设置。每次调用 scrollViewDidZoom 以及捏合手势完成时,我都会删除预定的调用。

这就是我所拥有的:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView{
    NSLog(@"resetting timer");
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(positionLock) object:nil];

    [self performSelector:@selector(positionLock) withObject:nil afterDelay:0.4];               
}

-(void)positionLock{
    NSLog(@"position locked ");
}

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale{

    NSLog(@"deleting timer");
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(positionLock) object:nil];
}

这是输出:

2010-05-19 22:43:01.931 重置计时器
2010-05-19 22:43:01.964 重置计时器
2010-05-19 22:43:02.231 重置计时器
2010-05-19 22:43:02.253 重置计时器
2010-05-19 22:43:02.269 重置计时器
2010-05-19 22:43:02.298 重置计时器
2010-05-19 22:43:05.399 删除定时器

如您所见,最后一个事件和倒数第二个事件之间的延迟应该足以让延迟的选择器调用执行。

如果我用普通的旧 performSelector 替换 performSelector:withObject:withDelay: 我得到这个:

2010-05-19 23:08:30.333 重置计时器
2010-05-19 23:08:30.333 位置锁定
2010-05-19 23:08:30.366 重置计时器
2010-05-19 23:08:30.367 位置锁定
2010-05-19 23:08:30.688 删除定时器

这不是我想要的,但它表明只是延迟导致它无法运行,与未在标题中声明的选择器、拼写错误或任何其他原因无关。

关于它为什么不起作用的任何想法?

【问题讨论】:

    标签: iphone cocoa-touch uiscrollview


    【解决方案1】:

    我认为在跟踪期间会忽略计时器事件(当手指向下滚动或缩放时)。您可能必须以不同的模式执行选择器(请参阅[NSObject performSelector:withObject:afterDelay:inModes:])。具体来说,尝试使用@[NSRunLoopCommonModes] 作为模式。

    【讨论】:

    • 看来你说得有道理。我想知道为什么这些事件被忽略了。这是一种设计选择吗?有这方面的文件吗?
    • 你是绝对正确的。这让我发疯了..!
    【解决方案2】:

    只是补充一下布赖恩所说的话-这是我对他的回答的实现:

    [self performSelector:@selector(callMethod) withObject:0 afterDelay:1.0 inModes:@[NSRunLoopCommonModes]];
    

    注意 - inModes: 采用一系列模式。

    【讨论】:

      猜你喜欢
      • 2012-11-08
      • 2013-06-02
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      相关资源
      最近更新 更多