performSelector:withObject:afterDelay:无法从scrollViewDidZoom中运行

时间:2010-05-19 13:13:08

标签: iphone cocoa-touch uiscrollview

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

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

所以我想我会在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删除计时器

这不是我想要的,但是用来表明它只是导致它不起作用的延迟,而不是选择器没有在标题中声明,拼写错误或任何其他原因。

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

2 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:5)

只是添加Brian所说的 - 这是我对他的回答的实现:

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

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

相关问题