2010-05-19 44 views
8

我觉得我应该知道这一点,但我已经被困了几个小时了,现在我已经没有想法。performSelector:withObject:afterDelay:不能从scrollViewDidZoom工作

理论很简单,用户使用捏来操纵缩放和滚动视图中的位置。如果他们持续捏住一小段时间,则滚动视图会记录缩放级别和内容偏移量。

所以我想我会在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:withObject:withDelay与普通的老式performSelector:我得到这个:

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删除计时器

其中ISN”我想要的东西,但只是表明它只是延迟导致它不func而不是在标题中声明的选择器,拼写错误或任何其他原因。

任何想法为什么它不工作?

回答

19

我认为定时器事件在跟踪过程中会被忽略(当手指向下以便滚动或缩放时)。您可能必须以不同模式执行选择器(请参阅[NSObject performSelector:withObject:afterDelay:inModes:])。具体而言,请尝试使用常数NSRunLoopCommonModes作为模式。

+0

它看起来像你有一个点。我想知道为什么这些事件被忽略。这是一个设计选择?有没有关于这方面的任何文件? – erkanyildiz 2012-10-22 16:35:33

+0

你是对的。这一直在推动我坚果..! – 2015-09-24 17:14:53

3

我想补充到什么布赖恩说 - 这是我实现了他的答案:

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

注 - inModes:需要模式的阵列。

相关问题