Pergunta

Vou acabar com uma matriz de feeds RSS e gostaria de uma etiqueta ou algo assim para exibi -los na parte inferior da vista. Eu gostaria de animar através de cada feed da matriz.

É isso que tenho até agora para animar, o que funciona para o Fade, mas apenas anima o último item da matriz.

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];

}

Tenho certeza de que é simples.

Obrigado

Foi útil?

Solução

Primeiro, você deve realmente considerar uma convenção de nomenclatura melhor. Chamando um uilabel de alimentação Não é muito útil para o futuro quando você precisa voltar e olhar para o seu código. Eu nomearia FeeLabel. Então, quando você itera através da sua lista de feeds, você pode simplesmente for (NSString *feed in feeds) E isso fará mais sentido. E também vai feedLabel.text = feed;.

De qualquer forma, o problema que vejo com seu código é que você está definindo repetidamente o alfa para zero em seu loop, mas você nunca o coloca de volta para um. Em outras palavras, você não está fazendo uma alteração no valor alfa. Ele permanece o mesmo em todas as iterações.

Então, talvez você possa esclarecer o que está tentando fazer. Se você deseja desaparecer o texto entre alterações no texto, precisará de uma animação e metodologia diferentes. Em vez de um loop, encorrente suas animações de modo que, quando o seu didstopselector, você define o texto e inicia o próximo. Algo como:

- (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];
  }
}

Outras dicas

Eu tentei seu código, ele desaparece no primeiro feed, mas não entra no evento AnimationDidstop. É por isso que não pode chamar o performanimation novamente. Existe algum conjunto para animação (delegado ou protocolo etc.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top