#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 для перебора цветов.