Ленивый UIPickerView - (он не будет двигаться дважды) - PullRequest
0 голосов
/ 19 февраля 2010

И заранее благодарю за внимание.Я пытаюсь добиться небольшого эффекта анимации в моем простом приложении, используя на этот раз объект UIPickerView.

По сути, когда происходит определенное событие, я хочу, чтобы мой просмотрщик анимации сам выбирал свою последнюю строку (с анимацией, конечно) и сразу после (без какого-либо дальнейшего взаимодействия с пользователем) его первой строки (с анимацией, конечно).Это, чтобы дать эффект «приложение стало сумасшедшим», который должен быть действительно остроумным, я думаю.

Поэтому мой код был:

[myPicker selectRow:[myPicker numberOfRowsInComponent:0]-1 inComponent:0 animated:YES];
[myPicker selectRow: 0 inComponent:0 animated:YES];

И что я получил, так это то, чтоСредство выбора выполнит только вторую инструкцию, независимо от указанной в ней строки.Кажется, он игнорирует первую.

Я думал, что это может быть для какой-то «умной» функции компилятора, которая отмечает, что две следующие инструкции выполняют присваивание одной и той же переменной, поэтому лучше игнорировать первую(без учета «анимированного» фактора).Я не знаю, так ли это, но я пытался переместить эти две инструкции в две инструкции if, основанные на значении какого-либо параметра, пытаясь таким образом обмануть компилятор (который не может знать во время компиляции значение этих параметров, поэтомуне предполагается выполнять такую ​​оптимизацию).Это не сработало, либо потому, что я совершенно не в курсе, либо потому, что компилятор гораздо умнее меня.Я даже подумал, что это может быть проблемой задержек и правильной последовательности событий, поэтому я попытался переписать код следующим образом:

-(void) setPickerRowToLastRow;
 {
     [myPicker selectRow:[myPicker numberOfRowsInComponent:0]-1 inComponent:0 animated:YES];
 }
 -(void) setPickerRowToFirstRow;
{
    [myPicker selectRow:0 inComponent:0 animated:YES];
}
                      .....
[self performSelector: @selector(setPickerRowToLastRow)
                     withObject: nil
                     afterDelay: 1];
[self performSelector: @selector(setPickerRowToFirstRow)
               withObject: nil
               afterDelay: 1];

И это не сработало: сборщик все еще выполняет только второе действие ибудет двигаться только один раз.

А теперь вопрос (ы):

Почему сборщик двигается только один раз?

Как мне достичь своей цели (даже если, возможно,немного тривиально)?

1 Ответ

2 голосов
/ 19 февраля 2010

Это не имеет ничего общего с компилятором.Это не так уж умно.

Причина, по которой выполняется только одна анимация, состоит в том, что анимация запускается не "сразу", а в следующем цикле выполнения (подробнее о том, что здесь ).В этот момент анимация запустится, используя последние значения, отправленные в средство выбора.

Использование executeSelector: withObject: afterDelay: должно работать, и причина этого, вероятно, в том, что вы поставили 1 как задержкуоба вызова.Установите значение 0 для первого и 2 (например) для второго, и оно должно работать.

...