0

私は自分のアプリに自動回転のサポートを実装しています。これは主にサブクラス化された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]

通常のビュー==>回転前にサイズ変更されたビュー(これを引き伸ばして黒いスペースをカバーしたい)

通常のポートレートビュー サイズ変更後、回転前

アニメーションの前に新しいコンテンツをストレッチし、最後にストレッチを解除するにはどうすればよいですか?あるいは、これをまったく別の方法で行う必要がありますか?すべての要素のサイズ変更をアニメーション化することはオプションではありません。

4

1 に答える 1

3

間違いなく、この質問について参照する必要のある包括的で決定的な情報源が1つあります。それは、WWDC2012、セッション240、「インターフェイスローテーションの研磨」です。

回転アニメーションをスムージングするためのいくつかのトリックについて詳しく説明します。

私が思い浮かぶ主なものは、あなたに関係があるかもしれません。を呼び出しsetShouldRasterizewillRotateToInterfaceOrientation:duration:目的のアニメーションを構成してから、でwillAnimateRotationToInterfaceOrientation:duration:オフshouldRasterizeにすることdidRotateFromInterfaceOrientation:です。

于 2012-12-11T01:04:51.580 に答える