Анимация появления/исчезновения UILabel

Я собираюсь получить массив RSS-каналов и хотел бы, чтобы метка или что-то подобное отображали их внизу представления. Я хотел бы анимировать каждый канал в массиве.

Это то, что я до сих пор анимировал, что работает для затухания, но анимирует только последний элемент массива.

feed = [[UILabel alloc] initWithFrame:CGRectMake(0,380,320,43)];
[self.view addSubview:feed];

feed.alpha=1;

NSArray *feeds = [NSArray arrayWithObjects:[NSString stringWithFormat:@"1234567"],[NSString stringWithFormat:@"qwerty"],[NSString stringWithFormat:@"asdfgh"],nil];

for (NSString* f in feeds){

    feed.text=f;

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    [UIView setAnimationDuration:2.0f];
    feed.alpha=0;
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
    [UIView commitAnimations];

}

Я уверен, что это просто.

Спасибо


person joec    schedule 09.08.2010    source источник


Ответы (2)


Во-первых, вы действительно должны подумать о лучшем соглашении об именах. Вызов UILabel ленты не очень полезен в будущем, когда вам придется возвращаться и смотреть на свой код. Я бы назвал его feedLabel. Затем, когда вы просматриваете свой список каналов, вы можете просто for (NSString *feed in feeds), и это будет иметь больше смысла. И так будет feedLabel.text = feed;.

Во всяком случае, проблема, которую я вижу в вашем коде, заключается в том, что вы постоянно устанавливаете альфу на ноль в своем цикле, но никогда не устанавливаете ее обратно на единицу. Другими словами, вы не вносите изменения в альфа-значение. Он остается неизменным в каждой итерации.

Так что, возможно, вы могли бы уточнить, что вы пытаетесь сделать. Если вы хотите, чтобы текст исчезал между изменениями текста, вам понадобится другая анимация и методология. Вместо цикла создавайте цепочки анимаций таким образом, чтобы при выполнении didStopSelector вы устанавливали текст и запускали следующий. Что-то типа:

- (void)performAnimation;
{
  [UIView beginAnimations:nil context:NULL];
  [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
  [UIView setAnimationDuration:2.0f];
  feed.alpha=0;
  [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:)];
  [UIView commitAnimations];
}

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
{
  feed.alpha = 1.0;
  NSString *nextFeed = [self getNextFeed]; // Need to implement getNextFeed
  if (nextFeed)
  {
    // Only continue if there is a next feed.
    [feed setText:nextFeed];
    [self performAnimation];
  }
}
person Matt Long    schedule 15.08.2010

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

person tester    schedule 31.08.2010
comment
вам нужно вызвать [UIView setAnimationDelegate:self]; - person joec; 20.09.2010
comment
Джоек, твой пост - правильный ответ. Вы должны опубликовать это как ответ, а не комментарий, чтобы вы могли получить за это признание. - person Duncan C; 18.05.2012