Animando Uilabel desaparecendo
-
27-09-2019 - |
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
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.)