UIView动画中的setFrame不会移动,只会卡入到位

时间:2011-07-20 13:52:08

标签: iphone objective-c ipad uiview uiviewanimation

在我的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中尝试启动动画有关...

2 个答案:

答案 0 :(得分: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你可能想看看UIView的iOS 4.0附带的“带块的动画”。

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

===编辑===

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

答案 1 :(得分:3)

将动画调用放在viewDidAppear中。 viewDidLoad用于更多数据类型设置。任何视觉效果(如动画)都应该放在viewDidAppear中。你已经证实了这一点 - 如果你稍等一下就可以了。