- 解釋一下什么意思呢艺普?就是一個(gè)button長按之后其數(shù)字的一直累加华畏。朋友們可能看起來很簡單谨敛,無非就是加一個(gè)長按手勢(longPressGesture)唄。對(duì)想法是對(duì)的抗悍,確實(shí)就是加一個(gè)長按手勢驹饺,那手勢方法內(nèi)部的實(shí)現(xiàn)怎么寫呢?注意長按手勢不是按多長時(shí)間就會(huì)調(diào)用多少次手勢處理方法缴渊,一般情況下只會(huì)掉三次(我說的是正常的情況下)逻淌,分別是:手勢開始,手勢改變疟暖,手勢結(jié)束,那么要想進(jìn)行累加田柔,那么就需要在手勢處理的方法里邊循環(huán)調(diào)用累加的方法俐巴,接著你就會(huì)想到用一個(gè)死循環(huán),當(dāng)手勢開始的時(shí)候調(diào)用硬爆,結(jié)束的時(shí)候讓其退出循環(huán)欣舵,在這個(gè)時(shí)候你就會(huì)發(fā)現(xiàn)在問題了,長按之后會(huì)不斷的累加缀磕,之后程序死了缘圈,為什么?其實(shí)你仔細(xì)看一下就會(huì)知道袜蚕,你在主線程里調(diào)用了一個(gè)死循環(huán)糟把,那能不卡死主線程嗎?之后有的人就會(huì)想牲剃,那我把這個(gè)死循環(huán)放在異步線程里執(zhí)行不就好了嗎遣疯?你確定好了嗎?朋友們可以試一下凿傅,接下來就會(huì)出現(xiàn)按著沒有反應(yīng)缠犀,那是因?yàn)槭裁矗恳驗(yàn)槟愀耈I的操作沒有放在主線程里聪舒,那么我們就會(huì)想到吧跟新UI的操作放在主線程里執(zhí)行不就好了嗎辨液?事實(shí)上不是這樣的,當(dāng)你把更新UI的操作放在主線程里執(zhí)行之后箱残,又會(huì)出現(xiàn)一個(gè)問題那就是滔迈,按完一次之后會(huì)直接奔潰,程序奔潰了,原因是這樣的邏輯根本不正確亡鼠。
- 上面說了各種嘗試赏殃,終于找到了解決的辦法,我把我的解決辦法间涵,說明一下仁热,做一個(gè)總結(jié)。我們可以加一個(gè)NSTimer勾哩,并且讓這個(gè)Timer循環(huán)執(zhí)行累加的方法抗蠢,而且這樣的好處是,我們直接的間隔是由我們自己控制的思劳,我們想累加的快點(diǎn)就可以快點(diǎn)我們想累加的慢點(diǎn)就可以慢點(diǎn)迅矛,我們設(shè)置一個(gè)flag,當(dāng)手勢開始的時(shí)候設(shè)置為YES潜叛,結(jié)束的時(shí)候設(shè)置為NO秽褒,根據(jù)這個(gè)flag當(dāng)為YES的時(shí)候我們開啟Timer,當(dāng)為NO的時(shí)候讓timer失效威兜,下面貼上代碼:(下面是遞減的方法销斟,遞增方法一樣)
添加手勢
UILongPressGestureRecognizer *longPressGuesForMinus = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(minusButtonLongPressed:)];
longPressGuesForMinus.allowableMovement = 50;
longPressGuesForMinus.delegate = self;
[self.minusButton addGestureRecognizer:longPressGuesForMinus];
手勢處理方法
- (void)minusButtonLongPressed:(UILongPressGestureRecognizer *)guesture {
BOOL flag = YES;
if (guesture.state == UIGestureRecognizerStateEnded || guesture.state == UIGestureRecognizerStateFailed) {
flag = NO;
}
if (flag) {
if (!self.timer) {
ACWeakSelf(self);
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.2 repeats:YES block:^(NSTimer * _Nonnull timer) {
[weakSelf minusValueChange];
}];
}
[self.timer fire];
}
if (!flag) {
if (self.timer.isValid) {
[self.timer invalidate];
self.timer = nil;
}
}
}
遞減方法
- (void)minusValueChange {
NSInteger value = [self.guestLabel.text integerValue]-1;
if (value>0) {
self.guestLabel.text = [NSString stringWithFormat:@"%ld", value];
}
}