5

在我的 viewDidLoad 方法中,我将一个按钮放在视图左侧,屏幕外。

然后我使用这两种方法对其进行动画处理:

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

    [self showButton];
}

和方法:

-(void) showButton {
    [myButton setTitle:[self getButtonTitle] forState:UIControlStateNormal];

    // animate in
    [UIView beginAnimations:@"button_in" context:nil];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDone)];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [myButton setFrame:kMyButtonFrameCenter]; // defined CGRect
    [UIView commitAnimations];
}

该按钮立即出现并且没有动画。此外,animationDone 选择器会立即被调用。

为什么它不将我的按钮动画化到屏幕上?

编辑:这与在 viewDidAppear 中尝试启动动画有关...

4

2 回答 2

6

我试过你的动画代码,它工作正常。

在哪里设置按钮的初始帧?是否有可能kMyButtonFrameCenter在开始动画之前错误地将按钮的框架设置为?这可以解释为什么会立即调用 animationDone 选择器。

这是有效的代码:

-(void) showButton {
    UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [myButton setTitle:@"test" forState:UIControlStateNormal];
    myButton.frame = CGRectMake(-100.0, 100.0, 100.0, 30.0);
    [self.view addSubview:myButton];

    // animate in
    [UIView beginAnimations:@"button_in" context:nil];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDone)];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [myButton setFrame:CGRectMake(100.0, 100.0, 100.0, 30.0)]; 
    [UIView commitAnimations];
}

如您所见,我没有更改您的动画代码中的任何内容。所以我认为问题出在按钮的框架上。

有点跑题了:如果你没有为 iOS < 4 构建你的应用程序,你可能想看看 iOS 4.0 附带的 UIView 的“动画块”。

[UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseIn animations:^void{myButton.frame = kMyButtonFrameCenter} completion:^(BOOL completed){NSLog(@"completed");}];

=== 编辑 ===

看了你的评论,看来我的怀疑是不正确的。在他的回答中, inspire48指出了正确的方向。您应该将按钮的位置放在viewDidAppear方法内部或showButton方法中,以确保在调用动画之前将按钮放置在屏幕之外

于 2011-07-20T14:45:38.880 回答
3

将动画调用放入 viewDidAppear。viewDidLoad 用于更多数据类型设置。任何视觉效果(例如动画)都应该放在 viewDidAppear 中。您已经确认了这一点 - 如果您稍等片刻,它就会起作用。

于 2011-07-20T14:47:40.647 回答