【发布时间】: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