2017-09-19 8 views
0

ポップイン効果を使用してUIViewControllersの間のトランジションをアニメートしようとしています。私animateTransition(using transitionContext:)機能でUIViewControllerAnimatedTransitioningはフレームサイズをアニメートしません

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { 
    let containerView = transitionContext.containerView 
    if let toController = transitionContext.viewController(forKey: .to) { 
     let toView = toController.view! 

     let finalFrame = transitionContext.finalFrame(for: toController) // (20, 20, 200, 200) 
     containerView.addSubview(toView) 

     toView.frame = CGRect(x: 20, y: 20, width: 100, height: 100) 

     UIView.animate(withDuration: self.duration, delay: 0.0, usingSpringWithDamping: 1.0, initialSpringVelocity: 0.0, options: .allowAnimatedContent, animations: { 
      toView.frame = finalFrame 
     }, completion: {(completed: Bool) -> Void in 
      transitionContext.completeTransition(completed) 
     }) 
    } 
} 

私は、フレームのサイズは200 by 200100 by 100から変更するだろうと期待していました。しかし、それはしませんでした。

Iはサイズ(幅または高さ)遷移ではなくながら、この関数は、フレームの位置をアニメーション化することができることを見出しました。フレームのサイズをどのようにアニメーション化できますか?

答えて

1

これはおそらく、あなたのアプリで自動レイアウトを使用していることに起因する新しいサイズで新しいフレームを設定変更するのではなく、これを試すことができます。
レイアウトエンジンが起動すると、元の制約に基づいてビューの位置が変更されます。
フレームではなく、制約を変更する(またはトランスフォームを適用する)ようにしてください。自動レイアウトを使用すると、フレームを変更することはほとんど役に立たない。

+1

まだ試したことはありませんが、自動レイアウトがこの問題を引き起こしていることは間違いありません。 – sCha

1

あなたは

UIView.animate(withDuration: self.duration, delay: 0.0, usingSpringWithDamping: 1.0, initialSpringVelocity: 0.0, options: .allowAnimatedContent, animations: { 
      toView.transform = CGAffineTransform(scaleX: 0.5, y: 0.5) 
     }, completion: {(completed: Bool) -> Void in 
      transitionContext.completeTransition(completed) 
     }) 
+0

良い提案をありがとうが、私は実際のプロジェクトでスケールファクターを維持する必要があります。 – sCha

関連する問題