试图让 2 个动画同时工作

Posted

技术标签:

【中文标题】试图让 2 个动画同时工作【英文标题】:Trying to get 2 animations to work simultaneously 【发布时间】:2012-12-25 16:36:59 【问题描述】:

在下一个代码中,有 2 个方法一个接一个地被调用。第一个使中心按钮消失,第二个使标签栏消失。他们分别工作正常。 我的问题是,当我尝试一个接一个地调用它们时,hideCenterButton 没有动画。按钮不会滚动到屏幕左侧,而是消失。

-(void)hideCenterButton:(BOOL)animated

    if(animated)

        [UIView animateWithDuration:0.3
                              delay:0.0f
                            options:UIViewAnimationCurveLinear
                         animations:^
                             CGRect frame = self.centerButton.frame;
                             frame.origin.x = -100;
                             self.centerButton.frame = frame;
                         
                         completion:^(BOOL finished)
                         ];
    

...

- (void)hideTabBar:(UITabBarController *) tabbarcontroller
    
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.5];
        //[UIView setAnimationDelay:1];
        for(UIView *view in tabbarcontroller.view.subviews)
        
            if([view isKindOfClass:[UITabBar class]] || [view isKindOfClass:[UIImageView class]])
            
                [view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)];
            
            else
            
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)];
            
        

        [UIView commitAnimations];
    

【问题讨论】:

不要滥用 x-code 标签。 【参考方案1】:

您可能遇到了基于 UIView 的动画的某种限制。您可以尝试以下几件事:

    animateWithDuration 也用于hideTabBar::确实,beginAnimation 是 UIView 动画的老方法; animateWithDuration 更新(ios4 引入);通过在机器人案例中使用相同的动画调用,您可能会获得更好的结果;这应该是直截了当的;这应该工作:

      - (void)hideTabBar:(UITabBarController *) tabbarcontroller
      
    [UIView animateWithDuration:0.3
                          delay:0.0f
                        options:UIViewAnimationCurveLinear
                     animations:^
        for(UIView *view in tabbarcontroller.view.subviews)
        
        if([view isKindOfClass:[UITabBar class]] || [view isKindOfClass:[UIImageView class]])
        
            [view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)];
        
        else
        
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)];
        
       
                     
                     completion:nil];
    
    

    使用 Core Animation 重写您的动画:这是一种稍微低级的机制,但它可以让您在性能方面获得最佳结果;例如,这是如何重写第一个动画:

首先你需要提供一个回调:

- (void)animationDidStop:(CABasicAnimation*)anim finished:(BOOL)flag 
       CALayer* layer = [anim valueForKey:@"animationLayer"];
       layer.position = [anim.toValue CGPointValue];

然后你可以像这样为你的按钮设置动画:

    CABasicAnimation* move = [CABasicAnimation animationWithKeyPath:@"position"];
    CGPoint pos = self.centerButton.center;
    pos.x -= 100;
    move.toValue = [NSValue valueWithCGPoint:pos];
    move.duration = 0.3;
    move.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    move.removedOnCompletion = NO;
    move.fillMode = kCAFillModeForwards;
    move.autoreverses = NO;
    move.delegate = self;
    [move setValue:self.centerButton.layer forKey:@"animationLayer"];
    [self.centerButton.layer addAnimation:move forKey:@"buttonPosition"];

使用 Core Animation,您最终会编写更多代码,并且需要花一些时间来学习 Core Animation 基础知识,但这是我解决两个相关动画时遇到的类似问题的唯一方法。

希望对你有帮助。

【讨论】:

我不知道如何将hideTabBar 转换为animateWithDuration,但我一定会阅读有关Core 动画的信息。 我添加了更多代码作为示例,包括animateWithDuration 第一个解决方案并没有改变任何东西,但我学到了一些新东西,所以 +1 就是为了这个。 :)。我正在尝试第二种解决方案,但最后两行出现错误(显然)。我应该放什么而不是subview 是的,想通了。由于某种原因没有动画,只是改变了中心按钮的位置。 好的,然后试试我的编辑;现在很可能会出现动画,但之后您的按钮栏将无响应 - 这是因为您应该在 animationDidStop: 委托调用中设置最终按钮位置...我将在其中添加代码秒...

以上是关于试图让 2 个动画同时工作的主要内容,如果未能解决你的问题,请参考以下文章

动画状态改变但不是实际动画

使用 jQuery 在向上滚动和向下滚动时添加不同的 CSS 动画

wpf 如何让两个动画同时动起来

Segue 动画无法完全正常工作

jQuery同时动画和淡化背景图像

d3 地理动画不会停止