オリエンテーションの変更後のUIView AddSubView:サイズ変更を見る
-
13-11-2019 - |
質問
ZORTATIONモードのXIBとしてUIViewを持っています。
このビューは、このようなViewControllerにプログラム的に追加されています。
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つのペン数を作成したり、フレームのサイズを変更することができますが、これは自動的にサイズ変更のアイデアに反しているようです。 目覚めていて、それを自動的に使用するビューにそれを追加した後にNIBに伝える方法がないと思います。デバイスが回転したときに完璧に機能するもの。
編集2:
IDZの解決策:
.
InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
inputView.frame = self.view.bounds;
[inputView show];
ありがとう!
解決
多くの場合、NIB / XIBファイルには、これすべての世話をするUIViewController
が含まれています。この場合、それらのビューコントローラ(NIB / XIB内)ではないため、ロード後の義務を引き継ぐ必要があります。
layoutSubviews
またはsetNeedsLayout
を介して直接または間接的に呼び出すことは、デフォルトの実装は何もしないため、ほとんど良くなりません。
入力ビューがself.Viewの範囲を埋めることを想定して、次のようにします。
InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
inputView.frame = self.view.bounds;
[inputView show];
.
サブビューのすべてのサイズ変更マスクは、このように機能するために正しく設定されていて、フレームを調整することができる全境界を埋めたくない場合は、明らかにしてください。
他のヒント
[self.view addSubview:viewSpinner];
viewSpinner.frame = self.view.frame;
[viewSpinner setNeedsLayout];
.
これは私にとって(y)
まだこの問題があるかどうかわかりません。
次のアーキテクチャがあるとしましょう。
- ウィンドウ
- subviewcontroller
(あなたは募集の向きに答えるために正しいQuerootateを実行しました)
このSubViewControllerには、
addSubview
関数を呼び出すだけで新しいUiviewControllersのビューを追加します。SheoSautoTateで境界操作を実装する代わりに、に実装する必要があります。
.- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{ self.newUIViewController.view.frame = self.view.bounds; }
didRotateFromInterface
...はshouldRotate
の後に呼び出されます。この関数では、範囲はすでに正しく設定されています。このようにあなたはコードごとに多くの操作を必要としません。
- subviewcontroller
この関連質問を見てください:
SO NIBから新しいビューをロードし、self.view
にサブビューとして追加した後、setNeedsLayout
を呼び出してください。