iPhone アプリは横向きモードですが、ビューの境界は縦向きのままです
質問
携帯電話の向きを横向きモードに設定すると、舞台裏で実際に何が起こっているのでしょうか?メイン画面の境界とサブビューの境界をトレースすると、幅と高さは 480x320 ではなく 320x480 のままです。
理由はありますか?
解決 6
問題を発見-回転後も境界が同じままである理由は、回転後に影響を受けるのはビューの変換プロパティだけだからです。
ビューの変換の簡単なトレースにより、次のことがわかります。
2012-01-31 12:19:02.114 TestScollviewRotation[9834:207] orientation: UIDeviceOrientationPortrait
2012-01-31 12:19:02.116 TestScollviewRotation[9834:207] 0.000000 -1.000000 1.000000 0.000000
2012-01-31 12:21:41.898 TestScollviewRotation[9834:207] orientation: UIDeviceOrientationPortraitUpsideDown
2012-01-31 12:21:41.898 TestScollviewRotation[9834:207] 0.000000 1.000000 -1.000000 0.000000
2012-01-31 12:21:58.780 TestScollviewRotation[9834:207] orientation: UIDeviceOrientationLandscapeRight
2012-01-31 12:21:58.780 TestScollviewRotation[9834:207] 1.000000 0.000000 -0.000000 1.000000
2012-01-31 12:19:03.181 TestScollviewRotation[9834:207] orientation: UIDeviceOrientationLandscapeLeft
2012-01-31 12:19:03.181 TestScollviewRotation[9834:207] 1.000000 0.000000 -0.000000 1.000000
他のヒント
境界プロパティまたはフレームプロパティをチェックしていますか?特定のコントロール、特に画面を埋めるUIViewは、どのフレームでも同じフレームを維持しているように見えます。 AppKitはtransformプロパティを設定してコンテンツを回転させると思います。
おそらく、boundsプロパティにはほとんどの場合期待する値がありますが、frameプロパティにはないことがわかります。
これは大きなトピックですが、0.02 に相当するものを追加します。コメントは縦向きと横向きの間の変化に制限されます。つまり、逆さ、表向き、裏向き、不明などではありません。
ビューが方向の変更をリッスンしていない場合、フレームと境界は方向に関係なく同じままになります。
方向の変更をリッスンするようにビューが登録されている場合、 限界があるかもしれない 変化;つまり、横向きでは、画面全体のフレームは <320,480> ですが、境界は <480,320> です。これは次のことを前提としています。
a.適切な YES 戻り値を指定して shouldAutorotateToInterfaceOrientation コールバックを使用しているか、または
b.UIDeviceOrientationDidChangeNotification をリッスンするために通知センターに明示的に登録します。
アプローチ 2a は、アプリ ウィンドウのルート ビュー コントローラーに属するビューにのみ当てはまります。つまり、最初にビューが追加されたビュー コントローラーです。アプローチ 2b は、アフィン変換と組み合わせて使用できます。 マニュアル 自動回転によって管理されないビューの適切な方向のレイアウトを取得するために、境界が変更されます。
UINavigationControllerを使用していない場合、ビューに正しいビューとフレームの境界が与えられないという問題が発生する可能性があることがわかりました。
UIWindowにビューを直接追加していましたが、まさにこの問題がありました。しかし、UIWindowとUIViewsの間にUINavigationControllerを挟むと、問題はなくなりました。
役立つこと
はい、フレームと境界は同じままです。ViewControllerのinterfaceOrientationプロパティを確認し、レイアウトがこれらに特に依存している場合は、それに応じて幅と高さを処理する必要があります。
現在、iPadアプリケーションでも同じ問題が発生しています。
I <!> quot; solved <!> quot;ビューinterfaceOrientation
をクエリすることにより、UIDeviceOrientationPortrait
またはUIDeviceOrientationPortraitUpsideDown
の場合、ビュー内のサブレイヤーのフレーム(CAGradientLayer
)を手動で設定します。