Я хотел бы анимировать через NSArray строк - PullRequest
0 голосов
/ 01 марта 2012

У меня есть NSArray строк, которые я хотел бы анимировать с помощью простой анимации постепенного появления / исчезновения.

----------------------------------------------------------------------------------
|     fade in
|     String 1 ---> displayed in UILabel
|     fade out
----------------------------------------------------------------------------------

с последующим

----------------------------------------------------------------------------------
|     fade in
|     String 2
|     fade out
----------------------------------------------------------------------------------

и т.д ...

Каждый из них удерживает свою позицию в течение 5 секунд, прежде чем перейти к следующему элементу в массиве. Я не уверен, с чего начать ... Я знаю, как выполнять анимацию, но я не совсем уверен, как анимировать массив строк с 5-секундной (без блокировки потоков) паузой на каждой итерации. Есть идеи?

ОБНОВЛЕНИЕ МОЕГО РЕШЕНИЯ НА ОСНОВЕ ПРИНЯТОГО ОТВЕТА

- (void)startTimer {
    arrayIndex = 0;

    NSArray *myarray = [alerts_dict allValues]; 
    breakingLabel.text = [myarray objectAtIndex:frameCount];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    [UIView setAnimationDuration:1];
    breakingLabel.alpha = 1;
    [UIView commitAnimations];

    arrayIndex++;
    pauseTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(myFunction) userInfo:nil repeats:YES];
}

- (void)myFunction {    

   [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^() {
       breakingLabel.alpha = 0;
   }
   completion:^(BOOL finished) {
       NSArray *myarray = [alerts_dict allValues]; 

       if (arrayIndex == [myarray count])
           arrayIndex = 0;

       breakingLabel.text = [myarray objectAtIndex:arrayIndex];

       arrayIndex++;

       [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^() {
           breakingLabel.alpha = 1;
       } completion:nil];
   }];
}

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Я бы сделал это так:

Установите альфа строки в 0 в viewDidLoad: используя этот фрагмент кода

for (UILabel *label in labelArray) {
     label.alpha = 0;
}

Затем в viewWillAppear: или viewDidAppear: введите этот код (зависит от того, что вы хотите, хотите, чтобы он запускался сразу после того, как представление появилось или нет)

for (int i = 0; i < 5; i++) {
     [self animateView:[labelArray objectAtIndex:i] withDelay:i * 5];
}

И тогда реализация этого метода будет выглядеть примерно так:

- (void)animateView:(UIView *)view withDelay:(float)delay {
     [UIView animateWithDuration:1 delay:delay options:UIViewAnimationOptionCurveEaseInOut animations:^{
          view.alpha = 1.0;
     } completion:^(BOOL completed) {
          [UIView animateWithDuration:1 animations:^{
               view.alpha = 0.0];
          }];
     }];
}

Конечно, вы можете настроить этот метод таким образом, чтобы он соответствовал вашим потребностям (например, если вы хотите сделать его более общим, добавьте туда аргумент продолжительности).

1 голос
/ 01 марта 2012

Вы можете сделать это довольно легко, используя блочную анимацию:

  1. Анимация ярлыка alpha до 0.0
  2. По завершении: установите text на новую строку и анимируйте ее alpha обратно на 1,0 (или исходное значение, каким бы оно ни было)

Эта процедура может быть вызвана повторно с помощью NSTimer обратного вызова тайм-аута. Просто создайте экземпляр таймера с интервалом 5.0, укажите обратный вызов и запланируйте его запуск в цикле выполнения следующим образом:

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self
                  selector:@selector(timerFired:) userInfo:nil repeats:YES];

(...)

- (void)timerFired:(NSTimer *)timer
{
    // call the method to update the label with the next string in the array
    // or invalidate the timer if you've reached the end of array
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...