ловит UIPicker selectRow уведомлением о готовой анимации - PullRequest
1 голос
/ 23 августа 2010

Я пытаюсь поймать, когда определенная анимация UIPicker закончена.

Я долго искал ответ на этот вопрос, но кажется, что общий ответ, который заключается в том, чтобы убедиться, что вызов selectRow находится внутри beginAnimationsи вызовы commitAnimations, не работает.
Проблема в том, что animationFinished запускается почти сразу после вызова commitAnimations и задолго до того, как фактическая анимация останавливается.
Думая, что проблема может заключаться в том, что selectRow создает свою собственную анимациюБлок и что я на самом деле не отслеживаю то, что я хочу, я попытался вызвать selectRow с анимированным: НЕТ, надеясь, что мой собственный блок анимации примет анимацию средства выбора.Это действительно сделало триггер animationFinished в конце анимации, но сама анимация стала прерывистой.

Как мне убедиться, что я отслеживаю правильную анимацию или я что-то упускаю?

Буду признателен за любую информацию, включая краткие ссылки на соответствующую документацию, которую я мог пропустить.

С уважением, M @

Это код:

- (void) animationFinished:(NSString *)animationID finished:(BOOL)finished context:(void *)context {  
     NSLog(@"animation %d stopped",animationID);  
}  

- (void)animateToRow:(UIPickerView *)pickerView toRow:(NSInteger)row inComponent:(NSInteger)component
{

    [UIPickerView beginAnimations:@"1" context:nil];  
    [UIPickerView setAnimationDelegate:self];  
    [UIPickerView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)];  
    [pickerView selectRow:row inComponent:component animated:YES];  
    [UIPickerView commitAnimations];  
}

1 Ответ

1 голос
/ 23 августа 2010

Вы на правильном пути. Когда вы устанавливаете себя в качестве делегата анимации в предоставленном вами коде, вы устанавливаете себя в качестве делегата для ВАШЕГО блока анимации. Поскольку вы не указали продолжительность анимации, ваш didStopSelector будет срабатывать немедленно.

Не существует "поддерживаемого" способа сделать это. И практически любое решение не гарантирует будущую совместимость.

Без сомнения, Apple упаковывает анимацию выбора в свои собственные блоки анимации. Вы можете сделать некоторую творческую отладку и определить точную продолжительность их анимации, и жестко закодировать свой блок анимации для соответствия. Как правило, анимации UIKit от Apple имеют фиксированную продолжительность, независимо от расстояния, которое необходимо пройти. (довольно часто около 0,33 секунды).

Я бы попробовал это ... Создайте метод категории для UIView и переопределите setAnimationDuration: и установите точку останова внутри этого метода. (Вероятно, лучше отключить его, пока вы не будете готовы к нему, так как это будет вызываться подавляющее количество раз.) -При вызове вашего метода animateToRow: torRow: inComponent: метод включите точку останова и просмотрите значение, переданное блоком анимации просмотров средства выбора.

Установка метода категории, как я сказал, эффективно устранит возможность устанавливать длительности для блоков анимации UIView, я не могу гарантировать, что не будет никаких побочных эффектов, и он абсолютно предназначен только для отладки.

...