8

ポートレートモードでUIViewをXIBとして持っています。

このビューは、次のようにビューコントローラーにプログラムで追加されます。

NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"InputView" owner:self options:nil];
    InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
    [self.view addSubview:inputView];

このビューには自動サイズ変更マスクが適切に設定されており、向きが縦向きから横向きに変わったときにうまく回転します。

ただし、向きが既に横向きで、向きの変更後にビューを作成すると、最初の縦向きになります。

マスクを使用して、ビューをポートレートに初期化またはサイズ変更するように指示する方法はありますか?

返信ありがとうございます。

編集: occulus と Inder Kumar Rathore の提案を使用して (ありがとう!)、コードを次のように変更しました。

InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
[self.view setNeedsLayout];
[self.view layoutSubviews];
[self.view layoutIfNeeded];
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
[self shouldAutorotateToInterfaceOrientation:orientation];

残念ながら、まったく変化はありません。同じ質問をしている人を見つけたと思います:

アプリが横向きモードの場合、サブビューを追加するときにビューのサイズが変更されません

答えは問題を正しく識別しますが、あまり心強いものではありません...確かに、2つのペン先を作成したり、フレームのサイズを変更したりできますが、これは自動サイズ変更の考えに反しているようです. 目を覚ましてビューに追加した後、自動サイズ変更機能を使用するようにペン先を伝える方法がないとは信じがたい.

編集2:

idz の解決策は次のとおりです。

InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
inputView.frame = self.view.bounds;
[inputView show];

ありがとう!

4

4 に答える 4

19

多くの場合、NIB/XIB ファイルには、UIViewControllerこれらすべてを処理する が含まれています。この場合、(NIB/XIB 内の) ビュー コントローラーではないため、ロード後の役割を引き継ぐ必要があります。

orlayoutSubviewsを介して直接または間接的に呼び出しても、デフォルトの実装では何も行われないため、あまり効果がありません。setNeedsLayoutlayoutIfNeeded

入力ビューで self.view の境界を埋める必要があると仮定すると、次のようにします。

InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
inputView.frame = self.view.bounds;
[inputView show];

これを機能させるには、サブビューのすべてのサイズ変更マスクを正しく設定する必要があります。明らかに、完全な境界を埋めたくない場合は、フレームを調整する必要があります。

于 2011-05-14T08:43:11.393 に答える
1
[self.view addSubview:viewSpinner];
viewSpinner.frame = self.view.frame;
[viewSpinner setNeedsLayout];

これは私にとってはうまくいきます(Y)

于 2011-08-05T12:05:52.387 に答える
1

まだこの問題があるかどうかはわかりません。

次のアーキテクチャがあるとします。

    • サブビューコントローラー

(必要な向きに答えるために正しい自動回転を実装する必要があります)

この subviewcontroller に、addSubview関数を呼び出すだけで新しい UIViewControllers のビューを追加します。

shouldautorotate で境界操作を実装する代わりに、それを実装する必要があります。

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
  self.newUIViewController.view.frame = self.view.bounds;
}

didRotateFromInterface... の後に呼び出されshouldRotateます。この関数では、境界はすでに正しく設定されています。

この方法では、コードによる操作はあまり必要ありません。

于 2011-09-26T14:07:03.180 に答える
0

この関連する質問を参照してください。

iOS でマスクの自動サイズ変更が有効になるのはいつですか?

したがって、ペン先から新しいビューをロードし、サブビューとして に追加した後、 をself.view呼び出してみてくださいsetNeedsLayout

于 2011-05-13T20:10:07.250 に答える