performSelector:withObject:afterDelay:不能从scrollViewDidZoom工作 [英] performSelector:withObject:afterDelay: not working from scrollViewDidZoom

查看:243
本文介绍了performSelector:withObject:afterDelay:不能从scrollViewDidZoom工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我觉得我应该知道这一点,但我已经被困扰了几个小时,我已经用完了想法。

I feel like I should know this but I've been stumped for hours now and I've run out of ideas.

这个理论很简单,用户使用捏合操作缩放和在scrollview中的定位。如果他们在短时间内保持缩放,则scrollview记录缩放级别和内容偏移。

The theory is simple, the user manipulates the zoom and positioning in a scrollview using a pinch. If they hold that pinch for a short period of time then the scrollview records the zoom level and content offsets.

所以我想我会开始一个performSelector:withObject:withDelay对scrollViewDidZoom委托方法。如果过期,则我记录设置。

So I thought I'd start a performSelector:withObject:withDelay on the scrollViewDidZoom delegate method. If it expires then I record the settings. I delete the scheduled call every time scrollViewDidZoom is called and when the pinch gesture finishes.

这是我所拥有的:

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

2010-05-19 22:43:01.931 resetting timer
2010-05-19 22:43:01.964 resetting timer
2010-05-19 22:43:02.231 resetting timer
2010-05-19 22:43:02.253 resetting timer
2010-05-19 22:43:02.269 resetting timer
2010-05-19 22:43:02.298 resetting timer
2010-05-19 22:43:05.399 deleting timer

如果我将performSelector:withObject:withDelay替换为纯旧的performSelector,那么最后一个事件和第二个最后事件之间的延迟应该足以执行延迟的选择器调用。我得到:

If I replace performSelector:withObject:withDelay with plain old performSelector: I get this:

2010-05-19 23:08:30.333重置计时器

2010-05-19 23:08:30.333 position locked

2010-05-19 23:08:30.366重设计时器

2010-05-19 23:08:30.367位置锁定

2010-05-19 23:08:30.688删除计时器

2010-05-19 23:08:30.333 resetting timer
2010-05-19 23:08:30.333 position locked
2010-05-19 23:08:30.366 resetting timer
2010-05-19 23:08:30.367 position locked
2010-05-19 23:08:30.688 deleting timer

这不是我想要的,但是显示它只是导致它不工作的延迟,选择器未在标题中声明,是拼写错误或任何其他原因。

Which isn't what I want but serves to show that it's only the delay that's causing it to not function, not something to do with the selector not being declared in the header, being misspelt or any other reason.

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

Any ideas as to why it's not working?

推荐答案

我认为在跟踪期间(当手指为了滚动或缩放时,定时器事件被忽略)。您可能需要以不同的方式执行选择器(参见 [NSObject performSelector:withObject:afterDelay:inModes:] )。具体来说,尝试使用常量 NSRunLoopCommonModes 作为模式。

I think that timer events are ignored during tracking (when a finger is down in order to scroll or zoom). You might have to perform the selector in a different mode (see [NSObject performSelector:withObject:afterDelay:inModes:]). Specifically, try using the constant NSRunLoopCommonModes for the mode.

这篇关于performSelector:withObject:afterDelay:不能从scrollViewDidZoom工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆