Вы можете использовать новые UIView
API-интерфейсы блочной анимации.Например:
[UIView animateWithDuration:1.0 animations:^{
// Animation here
} completion:^(BOOL b){
// Completion here
}];
Или, если анимация имеет неизвестную продолжительность, рассмотрите возможность использования @property
для BOOL
и использования наблюдения значения ключа.
Редактировать:
Я думаю, sudo rm -rf
NSTimer
может быть проще всего реализовать.Хотя вы можете использовать KVO, это не самый простой способ начать работу, а таймеры просты.Вот базовый пример того, как вы могли бы реализовать таймер условно в зависимости от потребности в нем.
-(void)doSomethingTimerTarget:(NSTimer *)timer{
if ([self isAnimating]) return;
else {
[timer invalidate];
[self doSomething:nil];
}
}
-(IBAction)doSomething:(id)sender{
if (sender && [self isAnimating]){ // if sender is nil then `doSomethingTimerTarget:` called the method no need to check again
[NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(doSomethingTimerTarget:) userInfo:nil repeats:YES];
}
else {
NSLog(@"actually doing something");
// Actually do something here
}
}
Одна из вещей, которую вы можете сначала добавить, это отключить кнопку, когда она нажата и должнадождитесь выполнения, чтобы предотвратить множественные запросы.
Редактировать: Ответ: «KVO было бы лучше, но как я мог предотвратить его, когда пользователь не нажал кнопку, и анимациязавершите, используйте другую BOOL, например pressedButton
"
Для начала, да, простой BOOL
будет работать.Но помните, что вам не нужно соблюдать ключевые значения в течение полного рабочего дня.В приведенном выше примере кода таймера, где создается таймер, замените его вызовом на addObserver:..
, затем при обратном вызове удалите наблюдателя.Таким образом, вы наблюдаете только тогда, когда это важно, вам не нужно поддерживать отдельный BOOL
.Вот непроверенный макет:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if ([keyPath isEqualToString:/*YourKeypath*/] && ![self isAnimating]){
[self removeObserver:self forKeyPath:/*YourKeypath*/];
[self doSomething:nil];
}
}
-(IBAction)doSomething:(id)sender{
if (sender && [self isAnimating]){ // if sender is nil then the observe method called this method no need to check `isAnimating` again
[self addObserver:self forKeyPath:/*YourKeypath*/...//etc
}
else {
NSLog(@"actually doing something");
// Actually do something here
}
}