0

UIView のカスタム サブクラスがあります。BottomBox と呼びましょう。

BottomBox には、次のオーバーライド メソッドがあります。

-(void)setBounds:(CGRect)bounds;

-(void)setFrame:(CGRect)frame; 

それぞれに [super set*:*] を呼び出し、現在および新しい CGRect のログを記録し、両方にブレークポイントを設定します。

BottomBox オブジェクトには autoresizingMask が設定されています。

bottombox1.autoresizingMask =
    UIViewAutoresizingFlexibleTopMargin |
    UIViewAutoresizingFlexibleLeftMargin |
    UIViewAutoresizingFlexibleRightMargin;

それらは画面の下部に配置されます。

BottomBox オブジェクトにはメインの .layer プロパティのサブレイヤーが含まれており、これらのサブレイヤーが変換され、これらのレイヤーの境界ボックスが BottomBox オブジェクトのビュー境界の領域の外に出ます。これにより、frame/bounds アクセサーが調整された境界値を返します。これは私が説明したものです。

しかし、デバイスの向きを変更すると、autoresizingMask プロパティで幅や高さの柔軟性が定義されていないにもかかわらず、BottomBox オブジェクトのサイズが異常に変更されます。私の経験では、境界/フレームの高さは調整されていませんが、幅は非常に歪んでいます。

今、境界とフレームの本当の意味を単に誤解していると感じています。おそらく実際には、サブビューとサブレイヤーに基づいて、アクセスごとにオンザフライで計算されます。

これらを調整できる他の方法があるかどうか知りたいのですが、おそらく何かを見落としています。

4

1 に答える 1

0

view.autoresizedSubviews が YES の場合、デバイスの回転中に、向きの変更とビューのサイズ変更を許可する UIViewController がサブビューに影響を与えます。

次に、柔軟なサイズ変更マスクを持つサブビューは、[UIView(Geometry) _applyAutoresizingMaskWithOldSuperviewSize:] 内からの setFrame の呼び出しを許可します。

setFrame: のレシーバーは、自動サイズ変更マスクに従って調整されたフレームを適切に受け取ります。

私の BottomBox には、setFrame オーバーライドがあり、フレーム引数と [super setFrame:frame] を呼び出した後のフレームの値を調べます。

私の実装固有のメモ:

たとえば、-120 度回転した 432 ピクセルの正方形には、589 の新しいバウンディング ボックスがあります。
その後、デバイスが回転し、任意の柔軟な自動サイズ変更マスク定数のために setFrame が呼び出されると、setFrame は 589 ピクセルの正方形のフレームを受け取ります。サイズ。回転は静かに適用され、さらに別の外側の境界ボックスが 803 ピクセルの正方形で定義されます。

実際には、この 803 の正方形は実際には高さ 589 ピクセルを維持しており、垂直方向のサイズは変更されていません。これは、自動サイズ変更マスクによるものです。私の特定のコンテキストでは、下のマージンが固定されています。

つまり、元は 432 ピクセルの正方形だったビューが、803x589 ピクセルの長方形で囲まれたビューになりました。まじで歪んだ。

于 2012-12-13T22:06:15.937 に答える