0

別のビュー コントローラーを提示しながら、カスタム トランジションを作成しようとしましたが、2 つの方法で成功しました。1 つは CGAfflineTransformIdentity を使用する方法で、もう 1 つは CGAffineTransformMakeTranslation を使用して ViewController をプッシュするだけです。

Apple のドキュメントでは、CGAfflineTransformIdentity を単位単位行列として説明しています。恒等行列を使用してビューを変換している間、アニメーションはどのように発生しますか?

実際の数学では、何かを単位行列で乗算すると、結果として同じ行列が得られます。

では、CGAfflineTransformIdentity では実際にどのように移行が行われるのでしょうか?

func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
    let container = transitionContext.containerView()
    let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)!
    let toView = transitionContext.viewForKey(UITransitionContextToViewKey)!

    let offScreenUp = CGAffineTransformMakeTranslation(0, -container.frame.size.height )
    let offScreenDown = CGAffineTransformMakeTranslation(0, 0)

    toView.transform = offScreenUp

    container.addSubview(fromView)
    container.addSubview(toView)

    let duration = self.transitionDuration(transitionContext)       
    UIView.animateWithDuration(duration, delay: 0.0, usingSpringWithDamping: 1.0, initialSpringVelocity: 0.8, options: nil, animations: {
          toView.transform = CGAffineTransformIdentity
         //toView.transform = offScreenDown
        }, completion: { finished in
         // tell our transitionContext object that we've finished animating
         transitionContext.completeTransition(true)
    })
}
4

1 に答える 1

1

ビューを単位行列で変換している間、アニメーションはどのように発生しますか?

それに対する答えは、技術的には、恒等行列を使用してビューを変換しても何も起こらないということです。ただし、ビューの変換を単位行列に設定すると、そのビューの既存の変換が取り消されます。したがって、スケーリングまたは回転されていた場合、そのトランジションを効果的に元に戻すことができます。あなたの場合、これは、ビューを上に移動した翻訳変換を元に戻しているため、原点に戻ったことを意味します。

toView.transform = CGAffineTransformIdentityこれは、アニメーション ブロックでORを呼び出すことができる理由を説明していますtoView.transform = offScreenDownCGAffineTransformMakeTranslation(0, 0)ゼロ点で変換された恒等変換です。

恒等変換が最初の変換を元に戻すだけであることを証明するには、それを目的の変換に連結できます。

toView.transform = CGAffineTransformConcat(offScreenDown,CGAffineTransformIdentity)

予想どおり、恒等変換は変換の内容を計算でコピーするだけなので、これは効果がありません。

同一性変換は、ソース データを変更せずに宛先データにコピーするデータ変換です (ウィキペディア)。

つまり、アニメーションブロック内offScreenDown== CGAffineTransformIdentity== CGAffineTransformConcat(offScreenDown,CGAffineTransformIdentity)==CGAffineTransformConcat(CGAffineTransformIdentity,CGAffineTransformIdentity)

iOS 7 では、コンテナ ビューがそのサブビューに変換を適用して正しい方向にあることを確認したため、アニメーション化されたトランジションに関連するアイデンティティ変換に注意することが重要です (コンテナは実際には新しい UIWindow インスタンス内にあるため)。 )。これは実際に開発者フォーラムで言及されました:

「カスタム プレゼンテーション トランジションでは、ウィンドウとウィンドウの rootViewController のビューの間に中間ビューをセットアップします。このビューは、アニメーションを実行する containerView です。iOS での自動回転の実装の詳細により、インターフェースが回転するときに、 Windows の rootViewController のビューにアフィン変換し、それに応じてその境界を変更します。containerView はルート ビュー コントローラーのビューではなくウィンドウから寸法を継承するため、常に縦向きになります。

于 2015-04-02T08:11:37.307 に答える