iOS: простая анимация

Я хочу создать простую анимацию, изменяющую альфа-значение:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:2];
[view1 setAlpha:0.00];
[UIView commitAnimations];

Хорошо, таким образом, я изменяю значение альфа-канала на две секунды, и он работает нормально, но я хочу вот что: когда альфа равна 0, анимация должна начаться в другое время до альфа = 1. Таким образом, анимация должна быть: альфа 0 -> альфа 1 -> альфа 0 -> альфа 1 -> ... и так далее с длительностью две секунды. Можете вы помочь мне?

мой полный код

-(IBAction){
FirstViewController *firstViewController = [[[FirstViewController alloc] init]autorelease];
[firstViewController.label1 setAlpha:1.00];
[firstViewController.label2 setAlpha:1.00];
view = firstViewController.viewFirst; //this is my view and I copy in other view
[self fadeOut:nil finished:nil context:nil];}

- (void) fadeOut:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {


[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:2];
[UIView  setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(fadeIn:finished:context:) ];
[view setAlpha:0.00];
[UIView commitAnimations];
}

- (void) fadeIn:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:2];
[UIView  setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(fadeOut:finished:context:) ];
[view setAlpha:1.00];
[UIView commitAnimations];
}

person cyclingIsBetter    schedule 17.06.2011    source источник


Ответы (5)


- (void) fadeOut:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:2];
    [UIView  setAnimationDelegate:self];
    if(animationRunning){
        [UIView setAnimationDidStopSelector:@selector(fadeIn:finished:context:) ];
    }
    [view1 setAlpha:0.00];
    [UIView commitAnimations];
}

- (void) fadeIn:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:2];
    [UIView  setAnimationDelegate:self];
    if(animationRunning){
        [UIView setAnimationDidStopSelector:@selector(fadeOut:finished:context:) ];
    }
    [view1 setAlpha:1.00];
    [UIView commitAnimations];
}

Они будут вызывать друг друга в конце анимации...

Все, что вам нужно сделать, чтобы начать работу, это позвонить:

[self fadeOut:nil finished:nil context:nil];
person Thomas Clayson    schedule 17.06.2011
comment
а если я хочу остановить эту анимацию? - person cyclingIsBetter; 17.06.2011
comment
предупреждение: семантическая проблема: метод '-fadeOut:finished:context:' не найден (тип возврата по умолчанию равен 'id') почему? - person cyclingIsBetter; 17.06.2011
comment
Если вы хотите остановить анимацию, у меня будет ivar (глобальная переменная класса) BOOL animationRunning, а вокруг строки [UIView setAnimationDidStopSelector:@selector(...)]; я бы поставил if(animationRunning){ ... }. Затем, когда вы хотите остановить анимацию, вы просто устанавливаете animationRunning = NO (и наоборот, когда хотите, чтобы анимация запускалась). - person Thomas Clayson; 17.06.2011
comment
Я не знаю, о чем предупреждение ... можете ли вы опубликовать весь вывод консоли? - person Thomas Clayson; 17.06.2011
comment
Хорошо, вы можете опубликовать весь свой класс, пожалуйста? включая методы, которые я вам дал. - person Thomas Clayson; 17.06.2011
comment
теперь я не предупреждаю, но когда я запускаю программу, у меня есть полученный программой сигнал: EXC_BAD_ACCESS. - person cyclingIsBetter; 17.06.2011
comment
все ок, я не привязывал вид в ИБ - person cyclingIsBetter; 17.06.2011

В iOS 4 и более поздних версиях вы можете сделать

   view1.alpha = 1.0;
   [UIView animateWithDuration:2.0
                          delay:0.0
                        options:UIViewAnimationOptionRepeat|UIViewAnimationAutoReverse
                     animations:^{
                        view1.alpha = 0.0;
                     }
                     completion:nil
   ];
person Pieter    schedule 17.06.2011

Вы можете установить обработчик завершения анимации (используя блочный API или +(void)setAnimationDidStopSelector:(SEL)selector) и запустить следующий.

В качестве альтернативы взгляните на эти методы:

+ setAnimationRepeatCount:
+ setAnimationRepeatAutoreverses:
person Eiko    schedule 17.06.2011

Я думаю, вы можете использовать только одну функцию (на основе функций предыдущего ответа):

- (void) fadeIn:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:2];
    [UIView  setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(fadeIn:finished:context:) ];
    [view1 setAlpha:mod(1-view1.alpha)];
    [UIView commitAnimations];
}

Альфа не должна быть отрицательным значением, поэтому необходимо применить мод.

person aknew    schedule 17.06.2011

Вы создаете ViewController, как показано ниже.

FirstViewController *firstViewController = [[[FirstViewController alloc] init]autorelease];

А затем добавить к нему анимацию, но когда вы добавили firstViewController.view в иерархию представлений (addSubview). Тоже просто звоню

[[[FirstViewController alloc] init]autorelease]

не будет создавать объект метки, если вы не переопределите его метод инициализации. Попробуйте отладить, если метка выделена в этот момент времени. Также для анимации я использую анимацию uiview с методом блока завершения.

person Atif    schedule 01.06.2013