Цветовой цикл фонового цвета пользовательского интерфейса

#xcode #uiview #colors #cycle #background-color

#xcode #пользовательский интерфейс #Цвет #цикл #background-color

Вопрос:

Прежде всего, я новичок в этом Xcode / Objective-C, так что будь со мной полегче! 🙂 Я создал тестовое приложение, в котором при нажатии некоторых кнопок меняется фон. У меня есть красный, синий, зеленый, белый, черный и кнопка оживления.

Я заставил приложение изменить цвет фона, нажав все цветные кнопки. Тем не менее, я хочу, чтобы приложение меняло цвета, скажем, 100 раз очень быстро при нажатии кнопки Revive. По какой-то причине это не работает.

Ниже приведен код, который не работает:

Используя приведенный ниже код, изменяется только последний цвет.

 - (IBAction)Revive:(id)sender {

    for (int y=0; y < 100; y  ) {
    view1.backgroundColor = [UIColor redColor];
    view1.backgroundColor = [UIColor greenColor];
    view1.backgroundColor = [UIColor blueColor];
    view1.backgroundColor = [UIColor whiteColor];
    view1.backgroundColor = [UIColor blackColor];
                                }  
}
  

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

 - (IBAction)Revive:(id)sender {

    [UIView animateWithDuration:0.2 animations:^{
    view1.backgroundColor = [UIColor redColor];
    view1.backgroundColor = [UIColor greenColor];
    view1.backgroundColor = [UIColor blueColor];
    view1.backgroundColor = [UIColor whiteColor];
    view1.backgroundColor = [UIColor blackColor];
    }];

 [UIView commitAnimations];

}
  

Кто-нибудь знает, почему это происходит, и решение моей проблемы?

Ответ №1:

Это сработает:

 - (void) doBackgroundColorAnimation {
    static NSInteger i = 0;
    NSArray *colors = [NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor], [UIColor blueColor], [UIColor whiteColor], [UIColor blackColor], nil];

    if(i >= [colors count]) {
        i = 0;
    }

    [UIView animateWithDuration:2.0f animations:^{
        self.view.backgroundColor = [colors objectAtIndex:i];           
    } completion:^(BOOL finished) {
          i;
        [self doBackgroundColorAnimation];
    }]; 

}
  

Комментарии:

1. Это, очевидно, не сработает, setNeedsDisplay сообщает системе рисования, что ей необходимо обновить вид в следующем цикле рисования, если вы переводите основной поток в спящий режим, этот цикл никогда не произойдет

2. Привет, спасибо за быстрый ответ. Я вижу, вы использовали функцию. Как мне объявить это в заголовочном файле?

3. Я получаю необъявленную ошибку doBackgroundAnimation, хотя я объявил функцию в файле .h с помощью: -(void) doBackgroundAnimation; Любая помощь?

4. @MaleBuffy Вызывается метод -doBackgrounColorAnimation . Исправьте свое написание, и оно должно сработать. Я это протестировал.

5. По-прежнему безуспешно. В нем по-прежнему указано, что doBackgroundColorAnimation не объявлен. Я думаю, что я неправильно объявляю метод. Где именно я должен это объявить? В @interface? или снаружи? Точный синтаксис? Чувак, это сложнее, чем я думал.

Ответ №2:

Для перерисовки вида требуется время, в первом примере вы задали фоновый цвет, но вид не перерисовывается до тех пор, пока вы не закончите с этим методом. С анимацией то же самое, это все равно, что сказать следующее:

 int x = 0;
x = 5;
x = 6;
// why is x 6 ? :(
  

Я бы использовал NSTimer для перебора цветов.