0

我在 iPad 应用程序中遇到了一些动画问题。应用程序启动时,我有四个 UIButtons 在屏幕上。

我基本上希望应用程序加载和四个按钮从屏幕顶部一次动画到视图中到位。

我有以下哪种动画,但我正在努力解决它。

-(void)viewWillAppear:(BOOL)animated
{
    CGPoint newLeftCenter = CGPointMake( 15.0f + myCocoButton.frame.size.width / 2.0f, myCocoButton.center.y);
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:4.0f];
    myCocoButton.center = newLeftCenter;
    [UIView commitAnimations];

}

我拥有的当前代码确实为按钮设置了动画,但不是以我想要的方式。我无法弄清楚如何将它实际放置在我想要的位置。

4

3 回答 3

2

在您的故事板中,将您的按钮布置在它们的最终位置。

viewWillAppear:中,保存每个按钮的位置并将按钮移出屏幕:

@implementation MyViewController {
    CGPoint _button0TrueCenter;
    CGPoint _button1TrueCenter;
    CGPoint _button2TrueCenter;
    CGPoint _button3TrueCenter;
}

static void moveButtonAndSaveCenter(UIButton *button, CGPoint offscreenCenter, CGPoint *trueCenter) {
    *trueCenter = button.center;
    button.center = offscreenCenter;
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    if (animated) {
        moveButtonAndSaveCenter(self.button0, CGPointMake(-100, 100), &_button0TrueCenter);
        moveButtonAndSaveCenter(self.button1, CGPointMake(420, 100), &_button1TrueCenter);
        moveButtonAndSaveCenter(self.button2, CGPointMake(-100, 200), &_button2TrueCenter);
        moveButtonAndSaveCenter(self.button3, CGPointMake(420, 200), &_button3TrueCenter);
    }
}

然后在 中viewDidAppear:,将它们设置回原来的位置:

static void animateButton(UIButton *button, CGPoint newCenter, NSTimeInterval delay) {
    [UIView animateWithDuration:.25 delay:delay options:0 animations:^{
        button.center = newCenter;
    } completion:nil];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    if (animated) {
        animateButton(self.button0, _button0TrueCenter, 0);
        animateButton(self.button1, _button1TrueCenter, 0.2);
        animateButton(self.button2, _button2TrueCenter, 0.4);
        animateButton(self.button3, _button3TrueCenter, 0.6);
    }
}
于 2012-05-03T21:34:50.077 回答
2

假设你有你的按钮在一个数组中,你可以做这样的事情(你的项目应该在笔尖的正确结束位置)

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

    CGAffineTransform transform = CGAffineTransformMakeTranslation(0.f, -200.f); 

    [self.buttons enumerateObjectsUsingBlock:^(UIButton *button, NSUInteger idx, BOOL *stop) {

       button.transform = transform; // This translates the view's off the top of the screen

       [UIView animateWithDuration:0.25f
                             delay:0.25f * idx
                           options:UIViewAnimationCurveEaseOut            // No point doing easeIn as the objects are offscreen anyway
                        animations:^{
                            button.transform = CGAffineTransformIdentity;
                      } completion:nil];

       }];
}

这将每次动画。您可能需要添加一个 ivar 来阻止这种情况发生,并在运行一次后将其设置为 YES。我在乱搞时发现的问题是,它调用的时候viewDidAppear: animatedNO第一次加载,所以我不能用那个 BOOL 作为检查

于 2012-05-03T23:49:54.933 回答
0

我写了一篇关于这个主题的博客文章:http ://www.roostersoftstudios.com/2011/07/01/iphone-dev-performing-sequential-uiview-animations/

我在那里有一个示例项目。

您可以将动画链接起来,当一个动画完成时,它会调用下一个动画的函数。您能否更具体地说明您遇到的具体问题?

于 2012-05-03T21:15:18.100 回答