私は自分のアプリに自動回転のサポートを実装しています。これは主にサブクラス化されたUIScrollViewであり、多くの特別な処理を実行します(最初の画像)。layoutSubviews
はメインで呼び出され、メインUIView
はスクロールビューのを呼び出しますlayoutSubviews
。これにより、コンテンツのサイズが予想どおりに新しい方向の境界に変更されます(2番目の画像)。次に、回転アニメーションが発生します。その結果、ユーザーは、デバイスを回転させた後、新しくサイズ変更されたコンテンツが最終的な位置に回転する前に、ビューの周囲に醜いデッドスペースが表示されます。
私のアプリは、コンテンツの暗黙的なアニメーションがオフになるように作成されているため、によって行われるサイズ変更layoutSubviews
は瞬時に行われます。(そうでなければ、そこで起こったことはすべて回転とともにアニメーション化されると思います。)私の観点から(そしてアプリの視覚的コンテンツを考えると)最も簡単なことは、新しい方向にサイズ変更してから、古い方向のように伸ばすことです。次に、ビューが所定の位置に回転している間に、そのストレッチの取り消しをアニメートします。これは機能していません。UIScrollView
'stransform
プロパティを微調整すると、ジオメトリの内部概念が台無しになり、で変更を加えると、その親UIView
が変更を上書きするように見えtransform
ますwillRotateToInterfaceOrientation
。それ以降に作成された変換はすべてviewWillLayoutSubviews
アニメーション化されるため、それまでに、以前に作成したストレッチを元に戻す必要があります。
willrotate start, main transform [1, 0, 0, 1, 0, 0] (untouched)
willrotate end, main transform [4, 0, 0, 0.25, 0, 0] (trying to stretch it arbitrarily)
willlayout, main transform [0, 1, -1, 0, 0, 0] (my stretch was overwritten by rotation; animation block has already started)
didlayout, main transform [0, 1, -1, 0, 0, 0]
willanim, main trasform [0, 1, -1, 0, 0, 0]
didrotate, main transform [0, 1, -1, 0, 0, 0]
通常のビュー==>回転前にサイズ変更されたビュー(これを引き伸ばして黒いスペースをカバーしたい)
アニメーションの前に新しいコンテンツをストレッチし、最後にストレッチを解除するにはどうすればよいですか?あるいは、これをまったく別の方法で行う必要がありますか?すべての要素のサイズ変更をアニメーション化することはオプションではありません。