0

iPadd アプリの向きを変更するときに問題が発生します。
サブビューをレイアウトする関数を作成して、ビューが表示されたり回転したりしたときに呼び出すことができるようにしました。
この関数は、「viewWillAppear」関数によって呼び出されると完全に機能します。しかし、「willAnimateRotationToInterfaceOrientation」関数がレイアウト関数 (「setPositionsForOrientation」) を呼び出すと、次の問題に直面しています。

  • 縦から横に変更すると、左側に128pxのオフセットがあります
  • 横向きから縦向きに変更すると、左側に負のオフセットがあります

私のUIScrollViewsもサイズ変更する必要があるため、どういうわけか新しいフレームプロパティが正しく処理されないという印象がありますが、そうしません。

それが私が書いたコードです:

- (void)viewWillAppear:(BOOL)animated{
 [self setPositionsForOrientation:self.interfaceOrientation];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 return YES;
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)newInterfaceOrientation duration:(NSTimeInterval)duration {
 [self setPositionsForOrientation:newInterfaceOrientation];
}

- (void)setPositionsForOrientation:(UIInterfaceOrientation)interfaceOrientation {
 // Position the UI elements for landscape mode
 if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
  self.view.frame = CGRectMake(0, 0, 1024, 748);
  self.menubarImage.frame = CGRectMake(0, 0, 1024, 121);
  self.backgroundImage.frame = CGRectMake(0, 0, 1024, 748);
  self.mainCategories.frame = CGRectMake(6, 6, 1012, 55);
  self.subCategories.frame = CGRectMake(58, 79, 960, 30);
  self.moviesContainer.frame = CGRectMake(6, 204, 1012, 456);
  self.searchButton.frame = CGRectMake(935, 709, 80, 30);
 }
 // Position the UI elements for portrait mode
 else {
  self.view.frame = CGRectMake(0, 0, 768, 1004);
  self.menubarImage.frame = CGRectMake(0, 256, 768, 121);
  self.toolbarImage.frame = CGRectMake(0, 924, 768, 80);
  self.backgroundImage.frame = CGRectMake(0, 256, 768, 748);
  self.mainCategories.frame = CGRectMake(6, 262, 756, 55);
  self.subCategories.frame = CGRectMake(58, 335, 704, 30);
  self.moviesContainer.frame = CGRectMake(6, 460, 756, 456);
  self.searchButton.frame = CGRectMake(680, 963, 80, 30);
 }
}

そして、ここに私の問題を説明するためのいくつかの写真があります..

IB のレイアウト (すべてのサブビューで contentMode が Top-Left に設定されています)

http://www.abload.de/image.php?img=interfacebuilderl9ey.png 

ポートレート モードが正しく表示される / おかしい

http://www.abload.de/image.php?img=portrait_oklxf1.png
http://www.abload.de/image.php?img=portrait_failma8y.png

ランドスケープ モードが正しく表示される / おかしい

http://www.abload.de/image.php?img=landscape_ok4z2l.png
http://www.abload.de/image.php?img=landscape_failvzuy.png

私は何を間違っていて、もっと重要なことをしましたか? どうすれば修正できますか? 通常の方法を説明するこの
投稿 を見つけましたが、ビューはUIViewControllerの単なるプロパティであるため、ビューの「layoutSubviews」メソッドをオーバーライドする方法がわかりません..

4

2 に答える 2

0

UIView の独自のサブクラスを作成し、それを UIViewController に設定して、layoutSubviews メソッドを実装できるようにする場合は、実際には非常に簡単です。

UIViewController は、ユーザーがビューを設定することを期待するビューを作成しませんが、Interface BUilder を使用すると、UIView が既に設定されています。

ビューを変更するには、次のようにします。

  • サブクラスを作成します。ここでは、MyView という名前を想定し、そこにすべての UI 要素 (ツールバー、ボタンなど) を配置します。
  • ビュー コントローラー ファイルを IB (*.xib) で開きます。
  • ビューを選択します (変更するビュー)
  • Identity Inspector に移動します (または Cmd+4 を押します)。
  • クラス ID フィールドに「MyView」と入力します

すべての UI 要素を ivar としてビューに配置したため、UIViewController からそれらにアクセスできなくなりましたか? そのため、UIViewController からビュー (およびその ivar) を処理するための正しいアクセサー/プロパティとメソッドがあることを確認してください。;)

代替テキスト

幸運を ;)

編集:2011/01/17

コントローラーで [self.view xyz] を実行すると、警告が表示されますか? これは、UIViewController のビューが UIView オブジェクトとして宣言されているためです。そして、UIView をサブクラス化し、IB に設定しました。したがって、ビューにアクセスするたびにキャストする必要があります。そうしないと、コンパイラは、MyView で宣言したメソッドを持たない通常の UIView であると認識します。次のようにします。

[(MyView *)self.view xyz]; //and for that don't forget to #import "MyView.h"

これはうまくいくはずです。しかし、なぜ得たのかわかりません:「プロパティ 'view'タイプはスーパークラス 'UIViewController'プロパティタイプと一致しません」最初に私が言ったことを試してください;) MyViewを次のように宣言しましたか?

@interface MyView: UIView{
...
}
@property (...) XYZ *xyz;
...
@end
于 2011-01-14T16:09:26.650 に答える
0

.m ファイルの MyView クラスに次のコードを追加したところ、悲惨な状況から抜け出すことができました。

- (void)awakeFromNib
{
    self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}
于 2011-01-26T08:51:47.303 に答える