Я пытаюсь создать игру на запоминание, но в какой-то момент мне нужно, чтобы изображения на UIbutton мигали. В течение x секунд я хочу, чтобы они были видны, а в течение x секунд я хочу, чтобы они были скрыты. Я застрял и просто хотел бы, чтобы кто-нибудь дал мне алгоритм, который будет работать. Спасибо.
Создание образа прошивки на UIButton?
Ответы (2)
Базовый подход состоит в том, чтобы открывать и закрывать представление, устанавливая альфа-канал.
UIView *view = imageView; // Or whatever
NSTimeInterval x = 2.0; // Or whatever
double delayInSeconds = x;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ // Wait for x seconds to hide
view.alpha = 0.0; // HIDE
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ // Wait for x seconds to show
view.alpha = 1.0; // SHOW
});
});
Немного более визуально привлекательный подход - постепенно увеличивать и уменьшать изображение.
UIView *view = imageView; // Or whatever
NSTimeInterval x = 2.0; // Or whatever
NSTimeInterval fadeInterval = 0.5; // Or whatever
double delayInSeconds = x;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ // Wait for x seconds to hide
[UIView animateWithDuration:fadeInterval animations:^{
view.alpha = 0.0; // HIDE
} completion:^(BOOL finished) {
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ // Wait for x seconds to show
[UIView animateWithDuration:fadeInterval animations:^{
view.alpha = 1.0; // SHOW
}];
});
}];
});
См. dispatch_after(3)
, _ 4_ и _ 5_.
ОБНОВЛЕНИЕ
В ПОРЯДКЕ. на основе вашего комментария я сделаю все немного проще.
Шаг 1. Заставьте изображение исчезнуть. Это можно сделать, установив альфа (прозрачность) на 0, установив скрытый на YES или удалив представление из его супервизора. Для простого эффекта на этот раз я установлю для скрытого значение ДА.
view.hidden = YES;
Шаг 2. Заставьте изображение исчезнуть через заданное время. Есть удивительное количество способов сделать это. Я буду придерживаться метода dispatch_after (), но сделаю его более понятным. Этот шаг состоит из двух частей. Часть а) устанавливает время, которое вы хотите, чтобы вид был скрыт. Часть б) - это скрыть вид.
// Part a) Set the time you want the view to disappear.
double howLongBeforeDisappearing = 2.0; // seconds
dispatch_time_t timeToDisappear = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(howLongBeforeDisappearing * NSEC_PER_SEC));
// Part b) Hide the view
dispatch_after(timeToDisappear, dispatch_get_main_queue(), ^{
view.hidden = YES;
});
Вокруг важного кода много чего, но сосредоточьтесь на howLongBeforeDisappearing = 2.0
и view.hidden = YES
. Это говорит о том, что через 2 секунды установите для view.hidden значение ДА.
Наконец, нам нужно отменить это, чтобы все снова появилось. Для этого мы делаем то же самое, за исключением того, что на этот раз мы устанавливаем для view.hidden значение NO. Имейте в виду, что нам нужно добавить время ожидания исчезновения представления при установке времени для повторного появления.
// Part c) Set the time you want the view to reappear.
double howLongBeforeReappearing = howLongBeforeDisappearing + 2.0; // seconds
dispatch_time_t timeToReappear = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(howLongBeforeReappearing * NSEC_PER_SEC));
// Part d) Show the view
dispatch_after(timeToReappear, dispatch_get_main_queue(), ^{
view.hidden = NO;
});
Сложив все это вместе, мы получим последний кусок кода.
// Part a) Set the time you want the view to disappear.
double howLongBeforeDisappearing = 2.0; // seconds
dispatch_time_t timeToDisappear = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(howLongBeforeDisappearing * NSEC_PER_SEC));
// Part b) Hide the view
dispatch_after(timeToDisappear, dispatch_get_main_queue(), ^{
view.hidden = YES;
});
// Part c) Set the time you want the view to reappear.
double howLongBeforeReappearing = howLongBeforeDisappearing + 2.0; // seconds
dispatch_time_t timeToReappear = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(howLongBeforeReappearing * NSEC_PER_SEC));
// Part d) Show the view
dispatch_after(timeToReappear, dispatch_get_main_queue(), ^{
view.hidden = NO;
});
Вот как я заставил кнопки мигать
- (void) blinkAll {[NSTimer scheduleTimerWithTimeInterval: .5 target: self selector: @selector (hideBoxes) userInfo: nil Repeats: NO];
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(showBoxesCurrent) userInfo:nil repeats:NO];
[NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(hideBoxes) userInfo:nil repeats:NO];
[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(showBoxesCurrent) userInfo:nil repeats:NO];
[NSTimer scheduledTimerWithTimeInterval:2.5 target:self selector:@selector(hideBoxes) userInfo:nil repeats:NO];
[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(showBoxesCurrent) userInfo:nil repeats:NO];
[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(hideBoxes) userInfo:nil repeats:NO];
[NSTimer scheduledTimerWithTimeInterval:3.5 target:self selector:@selector(enableGamePlay) userInfo:nil repeats:NO];
}
Функции showBoxesCurrent и hideBoxes - это базовые циклы, которые получают все массивы кнопок и устанавливают их как скрытые или не скрытые, которые активируются функцией NSTimer.