1

iPadxibを縦向きにしたUIViewControllerがあります。iPadが横向きで、そのビューコントローラーをUISplitViewControllerの詳細ペインに配置すると、それに合わせて自動的にサイズが変更されます。これはすばらしいことです。

ただし、-viewDidLoadでビューを構成しているとき、ビューの最終的なサイズはまだ横向き/サイズではありません。

-didRotateFromInterfaceOrientation:メソッドとそれに関連する他のメソッドは、UIViewControllerがすでに横向きにロードされている場合は呼び出されません。したがって、スクロールビューとそのコンテンツのcontentSizeをいつ、どこで適切に設定できますか?

スクロールビューを垂直方向にスクロールするだけにしたいので、scrollView内のcontentViewが、どの方向にあるかに関係なく、ViewControllerの幅に再フィットするようにします。

チェックする.frameまたは.boundsに関係なく、ビュー、スクロールビュー、またはSplitViewControllerの詳細ビューコントローラーでさえ、実際のサイズが表示されます。UISplitViewControllerを使用して横向きになっている場合、左側の幅は320ピクセルです。つまり、右側の幅は704ピクセルを超えてはなりませんが、ビューとスクロールビューのフレームと境界を確認すると、幅は768ピクセルと報告されます。これは正しくありません。

スクロールインジケーターが正しく表示されるので、私のスクロールビューの幅は明らかに704pxです。

私は何が欠けていますか?

これが-viewDidLoadの私のコードです...

CGSize textSize = [self.purchase.textDescription sizeWithFont:self.labelTextDescription.font constrainedToSize:allowedSize lineBreakMode:UILineBreakModeWordWrap];

CGRect textFrame = self.labelTextDescription.frame;
textFrame.size.height = textSize.height;
self.labelTextDescription.frame = textFrame;

CGRect contentFrame = self.contentView.frame;
contentFrame.size.height += textSize.height;

if (contentFrame.size.width > self.scrollView.frame.size.width) {
    contentFrame.size.width = self.scrollView.frame.size.width;
}

self.contentView.frame = contentFrame;

[self.scrollView addSubview:self.contentView];
self.scrollView.contentSize = self.contentView.frame.size;
4

3 に答える 3

6

ビューをレイアウトしてスクロールビューを設定する適切なタイミングcontentSizeは、実行ループのレイアウトフェーズです。このフェーズでは、UIKitlayoutSubviewsは、レイアウトが必要であるとマークされ、ウィンドウ内にあるすべてのビューにメッセージを送信します。ビューは、ウィンドウ階層に最初に追加されたとき、新しいサブビューが与えられたとき、サイズが変更されたときなど、さまざまなことが発生したときに、レイアウトが必要であると自動的にマークされます。メッセージを送信して、ビューをレイアウトが必要なものとして手動でマークすることもできsetNeedsLayoutます。

ビューがメッセージを受信するまでにlayoutSubviews、UIKitはlayoutSubviewsそれを必要とするビューの祖先(スーパービュー以上)にすでに送信しており、自動サイズ変更マスクまたは自動レイアウトの制約、および独自のサブビューに基づいてフレームが調整されています。 'フレームは、自動サイズ変更マスクまたは自動レイアウト制約に基づいてすでに調整されています。

self.viewがすでにのカスタムサブクラスである場合、最良のアプローチは単にそのクラスでUIViewオーバーライドすることです。layoutSubviewsそこにレイアウトコードを配置し、そこにスクロールビューを設定しますcontentSize

カスタムサブクラスを使用しておらず、作成したくない場合は、展開ターゲットがiOS 5.0以降であれば、ViewControllerviewWillLayoutSubviewsまたはメソッドでレイアウトを行うことができます。viewDidLayoutSubviewsこれらのメッセージがいつ送信されるかはおそらく推測できます。:)

自動回転中、これらのメッセージ(、、、および)はすべてlayoutSubviews自動viewWillLayoutSubviews回転viewDidLayoutSubviewsのアニメーションブロック内に送信されるため、これらの方法のいずれかでレイアウトを行うと、レイアウトへの変更が自動回転アニメーション中にアニメーション化されるという利点もあります。 。

于 2012-10-17T23:54:53.740 に答える
0

まず、回転時にビューのサイズを変更したくない場合は、自動サイズ変更マスクを確認してください。インターフェイスビルダーでビューを作成した場合は、スーパービューのサイズが変更されていないことを確認してください。

ビューのサイズ設定プロパティ

を使用して、現在のインターフェイスの向きを確認できUIViewControllerますself.interfaceOrientation。これは、ビューを手動で設定する場合に役立つことがあります。

さらに、サイズを手動で調整する必要がある場合は、回転を実行する前(または実行した後)に、目的のフレームをビューに設定します。

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation;
于 2012-10-17T23:30:25.590 に答える
0

ステータスバーの向きをクエリして現在の回転を取得することviewDidLoadをお勧めします。スクロールビューの自動サイズ変更に依存しないことをお勧めします。これは扱いにくい傾向があるためです。ステータスバーを確認し、それに基づいてサイズを比例的に変更します。

[UIApplication sharedApplication].statusBarOrientation

于 2012-10-17T23:41:29.050 に答える