2010-02-19 2 views
0

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

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

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

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

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

Я думал, что это может быть для некоторой «умной» функции компилятора, которая отмечает, что две следующие инструкции выполняют присвоение одной и той же переменной, поэтому лучше игнорировать первый (не учитывая фактор «ANIMATED»). Я не знаю, было ли это так, но я попытался переместить эти две команды в двух операциях 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]; 

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

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

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

Как я могу достичь своей цели (даже если это может быть немного тривиально)?

ответ

2

Это не имеет никакого отношения к компилятору. Это не так умно.

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

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

+0

Я просто пытался и делал, как вы сказали, это работает (хорошо .. Я не так далек от решения). Кажется, что он работает с любыми парами параметров задержки, где вторая выше первой. Ваш ответ решил мою проблему, спасибо вам большое. – user236739

Смежные вопросы