web-dev-qa-db-ja.com

UIViewを拡大および縮小するアニメーションを作成する

UIViewとそのコンテンツのサイズを係数で変更するアニメーションを作成したい。基本的に、最初にビューを拡大してから元のサイズに戻すアニメーションを作成します。

これを行う最良の方法は何ですか? CALayer.contentScaleを試しましたが、何もしませんでした。

25
Flying_Banana

次のように、いくつかのアニメーションブロックを一緒にネストできます。

Objective-C:

[UIView animateWithDuration:1
                 animations:^{
                     yourView.transform = CGAffineTransformMakeScale(1.5, 1.5);
                 }
                 completion:^(BOOL finished) {
                     [UIView animateWithDuration:1
                                      animations:^{
                                          yourView.transform = CGAffineTransformIdentity;

                                      }];
                 }];

スイフト2:

UIView.animateWithDuration(1, animations: { () -> Void in
    yourView.transform = CGAffineTransformMakeScale(1.5, 1.5)
    }) { (finished: Bool) -> Void in
        UIView.animateWithDuration(1, animations: { () -> Void in
            yourView.transform = CGAffineTransformIdentity
        })}

Swift 3および4:

UIView.animate(withDuration: 1, animations: {
    yourView.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
}) { (finished) in
    UIView.animate(withDuration: 1, animations: { 
        yourView.transform = CGAffineTransform.identity
    })
}

スケール値と期間を独自のものに置き換えます。

51
JJC

ループする小さなアプローチを次に示します。

[UIView animateWithDuration:1
                      delay:0
                    options:UIViewKeyframeAnimationOptionAutoreverse | UIViewKeyframeAnimationOptionRepeat
                 animations:^{
                     yourView.transform = CGAffineTransformMakeScale(1.5, 1.5);
                 }
                 completion:nil];

オプション「UIViewKeyframeAnimationOptionRepeat」は、「呼吸」を維持したくない場合にループさせるものです。アニメーションブロックは「吸入」として機能し、UIViewKeyframeAnimationOptionAutoreverseオプションは自動的に「呼気」アニメーションを再生します。

10
Ian Spence

Swift 5 UIView拡張機能:

extension UIView {
    func Pulse(withIntensity intensity: CGFloat, withDuration duration: Double, loop: Bool) {
        UIView.animate(withDuration: duration, delay: 0, options: [.repeat, .autoreverse], animations: {
            loop ? nil : UIView.setAnimationRepeatCount(1)
            self.transform = CGAffineTransform(scaleX: intensity, y: intensity)
        }) { (true) in
            self.transform = CGAffineTransform.identity
        }
    }
}

次に、次を使用します。

yourView.Pulse(withIntensity: 1.2, withDuration: 0.5, loop: true)

yourViewを独自のビューに置き換えてください。

1
Stephen Collins