7

UINavigationControllerアプローチを介してカラーピッカーを起動できる構成UITableViewがあります。

[self.navigationController pushViewController:colorPickerViewController animated:YES];
[colorPickerViewController release];

この効果は、ColourPickerの上部(および戻るボタン)にナビゲーションバーがあることを意味します。

ColourPickerViewControllとそれが表示するColourPickerViewの構造は次のとおりです。

- ColourPickerViewController - in it's XIB file at the top level view it has:
  - ColorPickerView : UIView (i.e. custom UI view) - in it's methods it has:
    - (id)initWithCoder:(NSCoder*)coder  {
       if ((self = [super initWithCoder:coder])) {
         CGFloat currVertBounds = self.bounds.size.height;

ここでの問題は、currVertBoundsの値が480に近づいているため、ナビゲーションバーが考慮されていないことです。

質問:ColorPickerViewインスタンスの実際に表示される高さを取得するにはどうすればよいですか?

カスタムUIViewでレイアウトを計算しようとすることと関係がありますか?おそらく、その段階でカスタムビューが全体的なcontroll / NavigationController内にレンダリングされませんか?

4

3 に答える 3

7

読んでいるboundsのが早すぎます。で発生するレイアウト/サブビューの魔法は、のUIKit間に発生しません[super initWithCoder:]boundsビューを読んでレイアウトする必要があります。

  1. viewDidLoad/で、viewWillAppear手動で作成されたすべてのUI要素の自動サイズ設定パラメーターを設定して、さまざまなインターフェイスの向きに関して移動できるようにします。これらの関数では、正確に正確であることに依存しませんboundsが、少なくとも適切な高さ:幅の比率であると言えます。ただし、方向が間違っている可能性があります。
  2. viewDidAppear、要素を手動で配置する場合。すべてのサイズ変更などがviewDidAppear行われるまでに、心配する必要があるのは将来の回転だけです。これについては、でビューを調整する必要がありますwillAnimateRotationToInterfaceOrientation:duration:

状態に関するドキュメントwillAnimateRotationToInterfaceOrientation:duration:

このメソッドが呼び出されるまでに、interfaceOrientationプロパティはすでに新しい方向に設定されています。したがって、このメソッドでは、ビューに必要な追加のレイアウトを実行できます。

iOS 5.0のドキュメントでは、次の句を追加しています。

...新しい方向に設定され、ビューの境界が変更されました。したがって...

これは以前のiOSバージョンにも当てはまると思います。

于 2011-08-03T07:32:20.980 に答える
1

iPhone用のビューは、Interface Builderで作成した場合、定義上480ピクセルの高さになるため、ビューを初期化するときに表示されます。ビューが適切に初期化されてビュースタックに追加されると、使用可能な実際のスペースに一致するようにサイズが変更されます。

調整する前に、高さのビューを要求しているだけです。で高さを読み取ってみてくださいviewDidLoad。そうすれば正しいはずです。

于 2011-08-03T07:11:58.193 に答える
0

はい、これは正しいです。なぜなら、UINavigationControllerのインスタンスが(delegate.h)で宣言されており、そのnavigationBarがself.viewではなくウィンドウに追加されているからです。

現在のビューの境界を確認すると、320 * 480が返されるはずです。ビューにはないため、ビューにナビゲーションバーの高さを含めないでください。その窓に。

于 2011-08-03T06:44:05.913 に答える