0

我将得到一组 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];

}

我相信它很简单。

谢谢

4

2 回答 2

7

首先,您应该真正考虑更好的命名约定。当您必须返回并查看您的代码时,将UILabel 称为提要对未来没有太大帮助。我将其命名为feedLabel。然后,当您遍历提要列表时,您可以for (NSString *feed in feeds)这样做,这将更有意义。也会如此feedLabel.text = feed;

无论如何,我在您的代码中看到的问题是您在循环中反复将 alpha 设置为零,但您从未将其设置回 1。换句话说,您没有更改 alpha 值。它在每次迭代中都保持不变。

所以也许你可以澄清你想要做什么。如果要在文本更改之间淡化文本,则需要不同的动画和方法。而不是循环,链接你的动画,这样当你的 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];
  }
}
于 2010-08-15T06:27:29.310 回答
0

我试过你的代码,它在第一次提要时淡出,但它没有进入 animationDidStop 事件。这就是它不能再次调用 performAnimation 的原因。是否有任何动画集(代表或协议等)

于 2010-08-31T20:07:48.410 回答