我正在开发我的第一个iOS应用程序,并且遇到了第一个障碍,我找不到合适的答案。
问题:我有一个自定义UIGestureRecognizer
,并且所有内容都已正确连接,我可以在识别后的@selector
中为每次触摸运行代码。这对大多数事情来说都很好,但对其他人来说这是一个太多的输入。
我的目标:制作一个以指定间隔触发的计时器来运行逻辑,并在触摸被取消时取消它。
为什么我在这里问:解决方案有很多可能性,但没有一个能够最好地实现。到目前为止似乎是
performSelector
(及其中的一些变体)NSThread
NSTimer
NSDate
从所有的研究中,某种形式的线索似乎是可行的路线,但我不知道哪种方式最适合这种情况。
实现的示例:每0.10秒采用NSPoint
,并且采用前一点和当前点之间的距离。 [取每个点之间的距离产生非常混乱的结果]。
相关代码:
- (void)viewDidLoad {
CUIVerticalSwipeHold *vSwipe =
[[CUIVerticalSwipeHold alloc]
initWithTarget:self
action:@selector(touchHoldMove:)];
[self.view addGestureRecognizer:vSwipe];
[vSwipe requireGestureRecognizerToFail:doubleTap];
}
...
- (IBAction)touchHoldMove:(UIGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateEnded) {
}
if (sender.state == UIGestureRecognizerStateBegan) {
}
//other stuff to do goes here
}
答案 0 :(得分:11)
使用NSTimer
像这样设置:
theTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(yourMethodThatYouWantRunEachTimeTheTimerFires) userInfo:nil repeats:YES];
然后当你想取消它时,做这样的事情:
if ([theTimer isValid])
{
[theTimer invalidate];
}
请注意,在上面的示例中,您需要声明NSTimer的“theTimer”实例,它可用于两种方法。在上面的例子中,“0.5”表示计时器每秒会发射两次。根据需要进行调整。
答案 1 :(得分:1)
为了完整起见,我在这里添加了我的最终实现(不确定这是做到这一点的方法,但是这里有)
@interface {
NSTimer *myTimer;
}
@property (nonatomic, retain) NSTimer *myTimer;
@synthesize myTimer;
-------------------------------------------
- (void)viewDidLoad {
//Relevant snipet
CUIVerticalSwipeHold *vSwipe =
[[CUIVerticalSwipeHold alloc]
initWithTarget:self
action:@selector(touchHoldMove:)];
[self.view addGestureRecognizer:vSwipe];
[vSwipe requireGestureRecognizerToFail:doubleTap];
}
-------------------------------------------
- (IBAction)touchHoldMove:(UIGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateEnded) {
//Cancel the timer when the gesture ends
if ([myTimer isValid])
{
[myTimer invalidate];
}
}
}
if (sender.state == UIGestureRecognizerStateBegan) {
//starting the timer when the gesture begins
myTimer = [NSTimer scheduledTimerWithTimeInterval:someTimeIncrement
target:self
selector:@selector(someSelector)
userInfo:nil
repeats:YES];
}
}