动画视图缩放弹跳?

Posted

技术标签:

【中文标题】动画视图缩放弹跳?【英文标题】:Animate a view zoom-bouncing in? 【发布时间】:2011-05-26 01:57:52 【问题描述】:

有没有办法为视图设置动画,使其放大并有点过分,并且橡皮筋回到最终大小?我不确定如何制作这种动画。

【问题讨论】:

【参考方案1】:

当你想触发这个动画时写这个代码

popUp.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.001, 0.001);

[self.view addSubview:popUp];

[UIView animateWithDuration:0.3/1.5 animations:^
    popUp.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1);
 completion:^(BOOL finished) 
    [UIView animateWithDuration:0.3/2 animations:^
        popUp.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.9, 0.9);
     completion:^(BOOL finished) 
        [UIView animateWithDuration:0.3/2 animations:^
            popUp.transform = CGAffineTransformIdentity;                            
        ];
    ];
];

SWIFT 5.0

    selectView.transform =
        CGAffineTransform.identity.scaledBy(x: 0.001, y: 0.001)

    view.addSubview(selectView)

    UIView.animate(withDuration: 0.3 / 1.5, animations: 
        selectView.transform =
            CGAffineTransform.identity.scaledBy(x: 1.1, y: 1.1)
    )  finished in
        UIView.animate(withDuration: 0.3 / 2, animations: 
            selectView.transform = .identity.scaledBy(x: 0.9, y: 0.9)
        )  finished in
            UIView.animate(withDuration: 0.3 / 2, animations: 
                selectView.transform = CGAffineTransform.identity
            )
        
    

这是更新的代码(来自 fabio.cionini),因为它已被接受,因此更新为最新的。

【讨论】:

这是反弹和缩放类型动画的正确代码,您也可以在 Facbook API 中找到此代码,旧的 facebook api..... 只是为了添加到对话中,您可以更改动画点,例如:popUp.center=CGPointMake(0,0) 并在您的动画块内:popUp.center=self.view.center 这将创造 popUp 来自视图边缘并在视图内居中的错觉... 非常有用。谢谢。 太棒了,谢谢。使用它,我可以在不到两分钟的时间内为图像(instagram-ish)添加一个很酷的心跳动画! 超级...非常感谢【参考方案2】:

刚刚由 Amit Singh 使用块重构了代码,这使其更简单和可读。

popUp.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.001, 0.001);

[self.view addSubview:popUp];

[UIView animateWithDuration:0.3/1.5 animations:^
    popUp.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1);
 completion:^(BOOL finished) 
    [UIView animateWithDuration:0.3/2 animations:^
        popUp.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.9, 0.9);
     completion:^(BOOL finished) 
        [UIView animateWithDuration:0.3/2 animations:^
            popUp.transform = CGAffineTransformIdentity;                            
        ];
    ];
];

【讨论】:

这种动画有预览吗?【参考方案3】:

太多复杂的答案?。从 2017 年(Swift 3/4)开始,这样做要容易得多。

斯威夫特 4-

yourview.transform = yourview.transform.scaledBy(x: 0.001, y: 0.001)

UIView.animate(withDuration: 0.5, delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.3, options: .curveEaseInOut, animations: 
      yourview.transform = CGAffineTransform.identity.scaledBy(x: 1.0, y: 1.0)
  , completion: nil)

注意usingSpringWithDamping 参数。这个参数决定了你想要多少反弹/弹簧效果,并允许从 0 到 1 的值。值越低,反弹效果越多。此外,如果您不喜欢scaleBy 效果,那么您可以简单地使用好的旧框架来显示扩展和弹跳UIView

【讨论】:

我也走这条路。好奇你为什么使用.curveEaseInOut,不使用物理弹簧的动画曲线意味着你不使用easeInOut 曲线吗?似乎没有意义 CGAffineTransform.identity.scaleBy(1, 1) 等价于 CGAffineTransform.identity 这个春季动画也可以在 Swift 5 中使用。【参考方案4】:

如今,这可以通过更简单的方式完成:

view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.001, 0.001);
[UIView animateWithDuration:0.5 delay:0.2 usingSpringWithDamping:0.6f initialSpringVelocity:1.f options:UIViewAnimationOptionCurveEaseInOut animations:^
    view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.0, 1.0);
 completion:^(BOOL finished) 
    view.transform = CGAffineTransformIdentity;
];

【讨论】:

【参考方案5】:

Amit 的回答很好并且被接受。我在这里为想要在 Swift/future 中开发的人发布了该答案的 Swift 版本。我使用 Xcode 7.3.1 和 Swift 2.2 来开发这个。

popView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.001, 0.001)
self.view.addSubview(popView)
UIView.animateWithDuration(0.3/1.0, animations: 
    popView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1)
    , completion: finished in
      UIView.animateWithDuration(0.3/1.2, animations: 
          popView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.9, 0.9);
          , completion: finished in
            UIView.animateWithDuration(0.3/1.5, animations: 
               popView.transform = CGAffineTransformIdentity
              )
       )
)

谢谢,请对更新发表评论。

更新 这是 Swift 3 的相同代码。适用于 Xcode 8 和 ios 10。

let identityAnimation = CGAffineTransform.identity
let scaleOfIdentity = identityAnimation.scaledBy(x: 0.001, y: 0.001)
popView.transform = scaleOfIdentity
self.view.addSubview(popView)
UIView.animate(withDuration: 0.3/1.5, animations: 
    let scaleOfIdentity = identityAnimation.scaledBy(x: 1.1, y: 1.1)
    popView.transform = scaleOfIdentity
    , completion: finished in
        UIView.animate(withDuration: 0.3/2, animations: 
                let scaleOfIdentity = identityAnimation.scaledBy(x: 0.9, y: 0.9)
                popView.transform = scaleOfIdentity
                , completion: finished in
                    UIView.animate(withDuration: 0.3/2, animations: 
                        popView.transform = identityAnimation
                    )
                )
            )

希望这会有所帮助。

【讨论】:

【参考方案6】:

只是为了将来的代码重用和保持代码干净。

@interface UIView (Animation)
   - (void)addSubviewWithBounce:(UIView*)theView;


@implementation UIView (Animation)

-(void)addSubviewWithBounce:(UIView*)theView

   theView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.001, 0.001);

                        [self addSubview:theView];

                        [UIView animateWithDuration:0.3/1.5 animations:^
                            theView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1);
                         completion:^(BOOL finished) 
                            [UIView animateWithDuration:0.3/2 animations:^
                                theView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.9, 0.9);
                             completion:^(BOOL finished) 
                                [UIView animateWithDuration:0.3/2 animations:^
                                    theView.transform = CGAffineTransformIdentity;
                                ];
                            ];
                        ];


@end

【讨论】:

如何用相同的动画隐藏它? @Gabriel Molter:只需反转上面的动画,最后一个块是:popUp.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.001, 0.001);【参考方案7】:

使用以下代码进行缩放弹跳动画。

 #define DURATION 1.0

CAKeyframeAnimation *animation = [CAKeyframeAnimation
                                  animationWithKeyPath:@"transform"];

CATransform3D scale1 = CATransform3DMakeScale(0.5, 0.5, 1);
CATransform3D scale2 = CATransform3DMakeScale(1.2, 1.2, 1);
CATransform3D scale3 = CATransform3DMakeScale(0.9, 0.9, 1);
CATransform3D scale4 = CATransform3DMakeScale(1.0, 1.0, 1);

NSArray *frameValues = [NSArray arrayWithObjects:
                        [NSValue valueWithCATransform3D:scale1],
                        [NSValue valueWithCATransform3D:scale2],
                        [NSValue valueWithCATransform3D:scale3],
                        [NSValue valueWithCATransform3D:scale4],
                        nil];
[animation setValues:frameValues];

NSArray *frameTimes = [NSArray arrayWithObjects:
                       [NSNumber numberWithFloat:0.0],
                       [NSNumber numberWithFloat:0.5],
                       [NSNumber numberWithFloat:0.9],
                       [NSNumber numberWithFloat:1.0],
                       nil];
[animation setKeyTimes:frameTimes];

animation.fillMode = kCAFillModeForwards;
animation.removedOnCompletion = NO;
animation.duration = DURATION;
[animationView.layer addAnimation:animation forKey:@"popup"];

【讨论】:

【参考方案8】:

用于 iOS9 和 xCode 7

//for zoom in
    [UIView animateWithDuration:0.5f animations:^

        self.sendButton.transform = CGAffineTransformMakeScale(1.5, 1.5);
     completion:^(BOOL finished)];
// for zoom out
        [UIView animateWithDuration:0.5f animations:^

            self.sendButton.transform = CGAffineTransformMakeScale(1, 1);
        completion:^(BOOL finished)];

【讨论】:

【参考方案9】:

在您的 Xcode 中查看 UIView 类参考中的动画相关部分。提示:使用变换属性。

【讨论】:

【参考方案10】:

斯威夫特 5

完成时回调。

    func bounceIn(_ callBack: @escaping ()->()) 
        let scaleTransform = CGAffineTransform(scaleX: 0.0, y: 0.0)
        self.transform = scaleTransform
        UIView.animate(
            withDuration: 0.5,
            usingSpringWithDamping: 0.4,
            initialSpringVelocity: 0.4,
            options: [UIView.AnimationOptions.curveLinear],
            animations:  [weak self] in
                 self?.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
            ,
            completion:  (finished: Bool) -> Void in
                callBack()
        )
    

用途:

    bounceIn() 
        // doStuff when animation is complete
    

【讨论】:

以上是关于动画视图缩放弹跳?的主要内容,如果未能解决你的问题,请参考以下文章

缩放地图视图时动画AnnotationView消失?

如何利用CSS3动画实现弹跳效果

表格视图单元格缩放动画

iOS项目开发实战——制作视图的缩放动画

在视图上实现清晰的缩放动画

一起Talk Android吧(第四百七十六回:缩放类视图动画)