Анимиране на UILabel Fade In/Out

Ще завърша с масив от 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
joec, твоята публикация е правилният отговор. Трябва да го публикувате като отговор, вместо като коментар, за да можете да получите кредит за него. - person Duncan C; 18.05.2012