2017-11-19 9 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 
     }) 
    } 
}