私のアプリでは、iPhone 6の横向きに多くの無駄なスペースがあり、4インチの画面でもそれほどではありません。iPhone6Plusの横向きの2ペインビューをサポートするために、iOS8のUISplitViewControllerの変更をすでに使用しています。 、ただし、一部の小さなデバイスでも両方のペインを表示すると便利です。
便利なことに、AppleはWWDC2014セッション「UIKitを使用したアダプティブアプリの構築」を開催しました。このセッションには、これを行う方法の詳細が含まれていました。ここからサンプルコードをダウンロードできますが、要するにUISplitViewController
、UIViewController
サブクラスの内部に配置されます。サブクラスは、幅が十分に広いと見なすときに、分割ビューsetOverrideTraitCollection:forChildViewController:
を強制[UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular]
するために使用します。当時、サンプルコードは正常に機能し、ほとんどのデバイスで引き続き機能します。
しかし、自分のアプリでこのコードを使おうとすると、iPhone 6Plusではひどく失敗することがわかりました。サンプルコードをダウンロードして2つの変更を加えると、これを自分で確認できます。
AAPLTraitOverrideViewController.m
、21行目をsize.width > 500.0
、または414より大きい値に変更します。これは、分割ビューに6Plusの縦向きのビューが1つだけ表示されるようにするために必要です。これで、シミュレーターでアプリを実行できます。問題を確認するには、次のようにします。
あなたはすでに何かが正しくないことを見ることができます。すべてのテーブルセルには、縦向きの右側に矢印が付いているはずですが、そうではありません。彼らはまだ分割されたビューにいるように振る舞っています。これらの行の1つをタップすると、さらに悪化します。詳細ビューが下から上にスライドし、ナビゲーションバーが消えます。
ここで問題を引き起こしているiOS8のバグがあるに違いないと思います。しかし、このコードはiPhone 6 Plusが発表される前に共有されていたため、そのデバイスと互換性を持たせるためにいくつかの調整が必要な可能性もあります。これまでのところ、私が見つけた唯一の解決策は21行目を次のようなものに変更することですif (size.width > 500.0 && size.width < 736.0)
が、次にAppleが新しい画面サイズを導入したときに再び壊れることがあるコードは使用したくありません。これを処理するためのより良い方法はありますか?
常に水平サイズのクラスを通常にしたいと思うようです(UIUserInterfaceSizeClassRegular
)。これを行うには、をオーバーライドしますtraitCollectionDidChange:
。このメソッドでは、垂直サイズクラスがcompact
(横向きである可能性が高いことを示唆している)の場合、水平サイズクラスが通常になるようにトレイトコレクションをオーバーライドします。
UITraitCollection *compactHeight = [UITraitCollection traitCollectionWithVerticalSizeClass:UIUserInterfaceSizeClassCompact];
if ([self.traitCollection containsTraitsInCollection:compactHeight]) {
UITraitCollection *regularWidth = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular];
self.forcedTraitCollection = [UITraitCollection traitCollectionWithTraitsFromCollections:@[self.traitCollection, regularWidth]];
[self setOverrideTraitCollection:self.forcedTraitCollection forChildViewController:_viewController];
} else {
[self setOverrideTraitCollection:nil forChildViewController:_viewController];
}
ただし、より具体的な動作が必要な場合は、アプリ固有の動作をキャンバスサイズに依存する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加