2017-11-19 33 views
1

私はUIViewに自動レイアウトを制約しています。これは中心に置かれ、幅と高さに制約があります。表示されたら、回転変換を適用します。自動レイアウト制約付きのUIViewは、変形アニメーションの前に「ジャンプ」します

Rotated View

私はそのアニメーションボタンを押すと、私は戻って、「直立」位置(すなわち適用される回転なしで)に回転しながら、それは、画面上の高いポイントにアニメーション化します。だから、私は新しい翻訳変換設定:

let translation = CGAffineTransform(translationX: 1, y: -100) 
UIView.animate(withDuration: 0.5, animations: { 
    self.blueView.transform = translation 
}) 

は、私が見ることを期待することは上向きに翻訳しながら眺めが直立位置に戻し回転しています。

私が得意とするのは、ビューが右にずれている点にジャンプし、次に回転しながら上にアニメートすることです。

これを修正してアニメーション化する前に「ジャンプ」しないようにするにはどうすればよいですか?

enter image description here

答えて

0

あなたが翻訳変換アニメーションときblueViewが既にトランスフォームセット回転を持っているので、あなたはジャンプを見ています。それは予期せぬ結果につながります。

それはあなたが回転し、翻訳が前にアニメーションを変換して、アニメーションの変換をリセット組み合わせ動作させるために:

100ptアップ、あなたがこれを行うに正常に戻って、それを回転させる青色のビューを変換するには:

  1. 45°
  2. Sをダウン100ptそれを翻訳し、それを回転させるblueViewに変換を追加centerYAnchor定数を-100に設定すると、アニメーションの前に正しい位置にblueViewが表示されます。
  3. は削除するblueView.transform = .identityをアニメーション変換

これは実施例であるアニメーション:

class ViewController: UIViewController { 

    let blueView = UIView() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     blueView.backgroundColor = .blue 
     view.addSubview(blueView) 

     blueView.transform = CGAffineTransform(translationX: 0, y: 100).rotated(by: -CGFloat.pi/4) 

     let button = UIButton(type: .custom) 
     button.setTitle("Animate", for: .normal) 
     button.setTitleColor(.blue, for: .normal) 
     button.addTarget(self, action: #selector(didPress), for: .touchUpInside) 
     view.addSubview(button) 

     blueView.translatesAutoresizingMaskIntoConstraints = false 
     button.translatesAutoresizingMaskIntoConstraints = false 

     NSLayoutConstraint.activate([ 
      blueView.widthAnchor.constraint(equalToConstant: 20), 
      blueView.heightAnchor.constraint(equalToConstant: 20), 
      blueView.centerXAnchor.constraint(equalTo: view.centerXAnchor), 
      blueView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -100), 

      button.centerXAnchor.constraint(equalTo: view.centerXAnchor), 
      button.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -40) 
      ]) 
    } 

    @objc func didPress(sender: UIButton) { 
     UIView.animate(withDuration: 0.5, animations: { 
      self.blueView.transform = .identity 
     }) 
    } 
}