如何在viewDidAppear中为UIView添加动画?

7
我试图在viewDidLoad和viewDidAppear中添加动画,但是它没有起作用:
- (void)viewDidAppear:(BOOL)animated{
 [UIView beginAnimations:@"transition" context:NULL];
 [UIView setAnimationTransition:110 forView:self.view cache:YES];
 [UIView commitAnimations];
}

为什么?
3个回答

24

我遇到同样的问题,我认为我在这个SO问题上找到了解决方案。

当viewDidAppear被调用时,你仍然看不到屏幕上的任何内容(尽管它的名字是这样的),但你即将看到。接着可以使用performSelector:withDelay或NSTimer来启动你的动画。延迟只需设置为0.1,你的动画就会在屏幕出现时播放。

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    NSLog(@"View did appear!");

    [self performSelector:@selector(animationCode) withObject:nil afterDelay:0.1f];
}

- (void)animationCode {
    // you animation code
}

我以前读了很多文章,只有这篇让我受益匪浅。谢谢。 - Mr.OFF

0

你没有告诉视图应该动画到哪个状态,所以它什么也不会做。你需要在 beginAnimations:context:commitAnimations 之间放置代码,改变视图的外观(例如通过删除一个子视图并添加另一个来实现)。


嗯,我想我不需要告诉他这个。我将我的代码尝试放入了一个IBAction中,它可以工作。我为视图编写了setAnimationTransition: forView:,所以我在其中写入了动画应该在自己的视图中。但是它在viewDidLoad和viewDidAppear方法中都无法工作。 - Flocked

0
你没有正确使用beginAnimations:commitAnimations。您应该在它们之间放置一些通常不会被动画化的内容:例如,使用self.view.alpha = 0.5可以实现淡入淡出的效果。它们对于不在它们之间的任何内容都没有影响。 当调用viewDidAppear:时,您的视图已经出现了。太晚再进行动画了。您实际上想要做的是这样的:
```objc - (void)showMyViewWithAnimation { [UIView beginAnimations:nil context:nil]; [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:childView cache:YES]; [parentView addSubview:childView]; [UIView commitAnimations]; } ```
在上面的示例中,`childView`就是您示例中所称的`self.view`。
请写出转场的名称;通过观察110,没有人知道它是什么。这是一种不好的风格。</挑剔>

那段代码中的错误是你应该在 self.view 上执行 setAnimationTransition:forView:,而不是 drum.view。文档中说:“在容器视图上设置转场。” - lawrence
但我想要的是鼓视图的效果 ;) 这就是为什么我试图将动画放入drumViewController的viewDidLoad中的原因。 - Flocked

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接