我试图在媒体播放器中设置一个“FastForward/Next”按钮,可以轻触移动到下一首歌曲或在当前歌曲中保持快进。大多数情况下,它的工作原理是:你可以成功地快速前进,并成功移动到下一首歌曲,但事实是,使它工作的NSTimer
从不会失效,所以一旦开始快速前进,就永远不会停止。UIGestureRecognizer与NSTimer不会死亡
我设置的手势识别在viewDidLoad
:
UITapGestureRecognizer *singleTapFastForward = [[UITapGestureRecognizer alloc] initWithTarget: self action:@selector(nextSong:)];
singleTapFastForward.numberOfTapsRequired = 1;
[_buttonNext addGestureRecognizer:singleTapFastForward];
_holdFastForward = [[UILongPressGestureRecognizer alloc] initWithTarget: self action:@selector(startFastForward:)];
[_buttonNext addGestureRecognizer:_holdFastForward];
[singleTapFastForward requireGestureRecognizerToFail:_holdFastForward];
,这里是函数的肉:
- (IBAction)startFastForward:(id)sender {
_timerFastForward = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(executeFastForward) userInfo:nil repeats:YES];
}
- (void)executeFastForward {
[_avPlayer seekToTime:CMTimeMake(CMTimeGetSeconds([_avPlayer currentTime]) + 10, 1)];
if(_holdFastForward.state == 0) {
[self endFastForward:self];
}
}
- (IBAction)endFastForward:(id)sender {
[_timerFastForward invalidate];
}
这里是棘手的部分:当我在if(_holdFastForward.state == 0)
行设置断点,只要我放开按钮(它应该)就开始工作,并成功调用endFastForward
方法。据我的估计,这应该杀死计时器并结束整个周期,但随后再次调用executeFastForward
,然后再一次。 invalidate
行似乎什么都不做(并且我的代码中没有其他要点叫executeFastForward
)。
任何想法?这看起来很简单,如果invalidate
一行工作,一切都将是完美的。我只是不知道为什么executeFastForward
继续被称为。是我的NSTimer
TRON对Highlander的答案,还是还有其他事情正在进行?
没有帮助。 :/但我确实得到了一个线索:在连接remoteControlReceivedWithEvent(使用相同的NSTimer方法完美工作)之后,我可以放心地说,它与启动整个事件的'UIGestureRecognizer'有关。任何想法为什么会搞乱'invalidate'方法? – Nerrolken