2011-07-20 34 views
5

在我的viewDidLoad方法中,我在屏幕左边放置了一个按钮。UIView中的setFrame动画不会移动,只会捕捉到位

然后我用这两个方法来制作动画:

-(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 ...

+0

奇怪的是,如果我稍等一下,动画将起作用。 – TigerCoding

回答

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方法按钮的位置,以确保该按钮被放置在屏幕之前调用动画

+0

我试着将它放在viewDidAppear中,但它没有效果。但是,我确实发现通过使用延迟为0.2的计时器可以使一切正常。 – TigerCoding

+1

你有没有尝试过像我在上面的代码中那样做?因为它有效。当视图出现时,您是否需要绘制大量的UIElements? – joern

+0

是的,我只是给它一个旋转。我试图在那里设置框架,设置'中心'和其他一些东西。我终于简单地设置了一个计时器,在viewDidAppear后的0.2秒后关闭,并且所有的工作都是这样工作的。我仍然不知道为什么。 – TigerCoding

3

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

+0

动画调用在viewDidAppear中,但也许这有助于将按钮的位置放在那里(在调用showButton方法之前) – joern

+0

我试图将按钮放置在视图中,但确实没有帮助。 – TigerCoding