ViewController не обновляется перед сном - PullRequest
1 голос
/ 17 февраля 2012

Я написал следующий код:

Код:

[MyImage setHighlighted:true];
Sleep(1);
[MyImage setHighlighted:false];

мне нужно выделить мое изображение на одну секунду и затем вернуть его, но X-код, когда прибывает в [MyImage setHighlighted: true], ничего не делает (я знаю, что это делает), и после этого Sleep выполняется и main поток приложения переходит в спящий режим на 1 секунду, и после этого выполняется последняя строка, но мой вопрос заключается в том, почему в первой строке не обновляется пользовательский интерфейс, и я не вижу ничего в пользовательском интерфейсе.

В первой строке кода метод Sleep не выполняется, и основной поток находится в нормальном состоянии, и он должен установить выделение моего изображения, после чего он переходит в спящий режим на 1 секунду, а после этого переводит мое изображение в нормальное состояние, но почему нет?

Я знаю, что могу использовать NSTimer, но почему не работает следующий код?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 17 февраля 2012

jackslash хорошо объясняет, что происходит.

Вы можете изменить свой код примерно так:

[image setHighlighted:true];
[self performSelector:@selector(aMethodThatChangesTheHighlight) withObject:self afterDelay:1];

Наконец, обратите внимание, что обычно замораживание основного потокаплохая идея.

1 голос
/ 17 февраля 2012

изменения на экране вносятся только после возврата вашего метода.Затем все изменения объединяются и вносятся одновременно.В этом случае, когда вы спите основной поток, ваш метод не вернется, пока вы не выделите изображение.После того, как ваш метод вернется, UIKit посмотрит, нужно ли рисовать какие-либо изменения.Поскольку вы отменили свои изменения до того, как ваш метод вернулся, делать нечего, поэтому на дисплее не происходит никаких изменений.

Лучше всего было бы посмотреть, можете ли вы использовать методы анимации класса UIView.*

[UIView animateWithDuration:0.5 
                      delay:0 
                    options:UIViewAnimationCurveEaseInOut 
                 animations:^{
                       //animation code goes here
                       //note that you have to change something that UIView considers to be animatable
                       //e.g.
                       self.myView.alpha = 0;

                 } completion:^(BOOL done){
                       //code to execute once the animation has completed goes here
                 }];
0 голосов
/ 17 февраля 2012

Мне больше нравится ответ sch, но если вы хотите использовать анимацию в соответствии с предложением jackslash, вам придется заставить анимацию изменять что-то визуальное, чтобы блок завершения не запускался сразу. Даже добавление «задержки» не исправит это.

MyImage.alpha = 0.99f;
[UIView animateWithDuration:1.0f delay:0.0f options:UIViewAnimationOptionAllowUserInteraction animations:^{
    MyImage.alpha = 1.0f;
    [MyImage setHighlighted:YES];
} completion:^(BOOL finished) {
    [MyImage setHighlighted:NO];
}];
...