uiscreenアプリケーションフレームランドスケープアプリケーションで誤った長方形を返す(iPhone/iPad)
-
27-09-2019 - |
質問
Landscape Modeで起動する際に、iPadアプリケーションの正しい境界を取得するのに問題があります。 info.plistファイルに適切なキーが設定されており、ビューコントローラーがランドスケープ(およびポートレート、ナッチ)で適切に起動します。
私の中で applicationDidFinishLaunching:
方法私は3秒の遅延の後にセレクターを呼び出します、そしてその方法は [[UIScreen mainScreen] applicationFrame]
, 、しかし、それは私にポートレートフレーム(すなわち高さ>幅)を返しています。
誰かがこれを修正する方法を知っていますか?それは私にとってバグのような匂いがします(もしそうなら、私はレーダーを提出します)が、それが意図された動作の場合、それはどこで文書化されていますか?
解決
iPadをランドスケープオリエンテーションで保持し、アプリを起動している場合、ビューコントローラーは最初にポートレートビューの境界を見ます(方向がランドスケープを報告していても)。ビューコントローラーは、表示される前にランドスケープオリエンテーションに回転するメッセージを取得します。
他のヒント
私は決して頼りません [[UIScreen mainScreen] applicationFrame]
, 、特にアプリの起動中。
コードでビューを作成するときは、監督を使用してフレームを設定します。
「シミュレートされたインターフェイス要素」を備えたXIBSを使用している場合、それらは正しくサイズになり、すべてがうまく機能します。
UinavigationControllerベースのアプリ
uinavigationControllerベースのアプリの場合、フレームを直接取得します self.navigationController.view
, 、使用しようとしないでください [self loadView]
と self.view.superview
. 。 uinavigationControllerは、「隠された」サブビューを使用してジョブを行うため、直接的なスーパーは機能しません。
uinavigationcontrollerは特別です。アプリの起動中、ナビゲーションコントローラーがその後のビューをサイズするため loadView
呼び出されます。自動化がキックすると、画面の下部に小さなマージンが表示されます。
なぜuiscreen
[[UIScreen mainScreen] applicationFrame]
確実に動作しません(特にランドスケープでのアプリの起動中)。私の経験は、ViewControllerのものです interfaceOrientation
プロパティは一致しません applicationFrame
オリエンテーション。
CGRect bounds = [[UIScreen mainScreen] bounds]; // portrait bounds
if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) {
bounds.size = CGSizeMake(bounds.size.height, bounds.size.width);
}
これは、ビューコントローラーがランドスケープ上にあるときに正しいcgRECTを取得する方法です。
CGRect landscapeBounds;
if (self.view.frame.size.width < self.view.frame.size.height)
landscapeBounds = CGRectMake(self.view.frame.origin.y, self.view.frame.origin.x, self.view.frame.size.height, self.view.frame.size.width);
else
landscapeBounds = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);
これは設計どおりです。監督のサイズを照会し、必要に応じて調整する必要があります。
[[UIScreen mainScreen] applicationFrame]
アプリがランドスケープモードであっても、常にポートレートの長方形を返します。これはその事実に関連しています UIWindow
一度もない 実際に回転しますが、変換を変更するだけです rootViewController.view
代わりは。
確かに、ポートレートモードとランドスケープモードにルートビューオブジェクトを印刷できます。次のようなものが表示されます。
ポートレート:
<UIView: 0x96290e0; frame = (0 20; 768 1004); ...
風景:
<UIView: 0x96290e0; frame = (0 20; 768 1004); transform = [0, 1, -1, 0, 0, 0]; ...
Appleのガイドによると、起動画像を追加して、接尾辞-568Hを付けてください。
健全な心を持っている人がシステム設定をグラフィックに依存させる理由がわかりません。しかし、私はテストしたばかりで、それはうまくいきました。
これが簡単な検索の後に教えてくれた場所です 私は上でこの答えを見ませんでした、それが誰かに役立つと思いました。
s
CordovaプラグインでDismissViewControllerAnimatedでビューを却下すると、同じ問題に巻き込まれました。 MainViewControllerのViewWillappearメソッドのSingingatomコードを変更しました。
- (void)viewWillAppear:(BOOL)animated
{
CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
UIDeviceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
if (UIDeviceOrientationLandscapeLeft == orientation ||
UIDeviceOrientationLandscapeRight == orientation)
{
if (appFrame.size.width < appFrame.size.height)
{
appFrame = CGRectMake(appFrame.origin.y, appFrame.origin.x, appFrame.size.height, appFrame.size.width);
}
}
self.view.frame = appFrame;
[super viewWillAppear:animated];
}