[解決済み] Xcode 9の安全領域
質問
探索中 Xcode9ベータ版 発見 安全なエリア を発見しました。気になってAppleのドキュメントでSafe Areaについて調べたら、gistにこう書いてあった。 Autoレイアウトと直接対話するビューエリアです。 しかし、それは私を満足させませんでした、私はこの新しいものの実用的な使用を知りたいのです。
どなたか手がかりをお持ちではないでしょうか?
Apple doc for Safe area の結論の段落です。
UILayoutGuide クラスは、以前ダミービューによって実行されたすべてのタスクを実行するように設計されていますが、より安全で効率的な方法でそれを行うために設計されています。レイアウトガイドは、新しいビューを定義するわけではありません。また、ビュー階層に参加することもありません。代わりに、それらは単に、Auto Layoutと対話することができるそれらの所有のビューの座標系で長方形の領域を定義します。
どのように解決するのですか?
<ブロッククオート
セーフエリアは、レイアウトガイド(
セーフエリア・レイアウトガイド
)
.
バーや他のコンテンツによって遮蔽されていないビューの部分を表すレイアウトガイドです。iOS 11+ では、Apple は上部と下部のレイアウト ガイドを非推奨とし、単一のセーフ エリア レイアウト ガイドに置き換えます。
ビューが画面上に表示されているとき、このガイドは、他のコンテンツによって覆われていないビューの部分を反映しています。ビューの安全領域は、ナビゲーション バー、タブ バー、ツールバー、およびビュー コントローラーのビューを見えなくするその他の祖先によって覆われる領域を反映しています。(tvOSでは、安全領域は、画面のベゼルに組み込まれ、そのベゼルは
overscanCompensationInsets
プロパティで定義されています)。また、ビューコントローラの
additionalSafeAreaInsets
プロパティで定義された追加のスペースもカバーします。ビューが現在ビュー階層にインストールされていない場合、またはまだ画面上に表示されていない場合、レイアウトガイドは常にビューのエッジに一致します。
ビューコントローラのルートビューの場合、このプロパティの安全領域は、ビューコントローラのコンテンツの隠蔽されている部分全体と、指定した追加のインセットを表します。ビュー階層内の他のビューの場合、安全領域は、そのビューの隠蔽されている部分のみを反映します。例えば、ビューが完全にそのビューコントローラーのルートビューの安全領域内にある場合、このプロパティのエッジインセットは0になります。
Appleによると Xcode 9 - リリースノート
Interface Builder は、UIViewController の非推奨のトップとボトムのレイアウトガイドの代わりとして UIView.safeAreaLayoutGuide を使用します。新しいセーフエリアを使用するには、ビューコントローラのファイルインスペクタでセーフエリアレイアウトガイドを選択し、コンテンツと新しいセーフエリアアンカーとの間に制約を追加します。これにより、コンテンツがトップバーとボトムバー、およびtvOSのオーバースキャン領域によって隠されるのを防ぐことができます。iOS の以前のバージョンにデプロイする場合、安全領域への制約は Top and Bottom に変換されます。
既存の (上下の) レイアウト ガイドとセーフ エリア レイアウト ガイドの比較 (同様の視覚効果を得るため) として、簡単な参考例を示します。
セーフエリアレイアウト。
オートレイアウト
セーフエリアレイアウトで作業するには?
以下の手順で解決してください。
- セーフ エリア レイアウト」が有効でない場合は、有効にします。
- との接続を示す場合、'all constraint' を削除する。 スーパー表示 で接続されている場合は、すべての制約を削除し、セーフレイアウトアンカーで再接続します。または、制約をダブルクリックし、スーパー・ビューからセーフ・エリア・アンカーへの接続を編集する。
セーフエリアレイアウトを有効にし、制約を編集する方法のスナップショットのサンプルです。
上記の変更の結果は以下のとおりです。
SafeAreaを使ったレイアウトデザイン
iPhone X 用にデザインする場合、レイアウトを画面いっぱいに配置し、デバイスの丸い角、センサーハウジング、またはホーム画面にアクセスするためのインジケーターによって妨げられないようにする必要があります。
ナビゲーション バー、テーブル、およびコレクションなどの、システムが提供する標準的な UI 要素を使用するほとんどのアプリは、デバイスの新しいフォーム ファクターに自動的に適応します。背景の素材はディスプレイの端まで広がり、UI 要素は適切に挿入され配置されます。
カスタム レイアウトのアプリの場合、特にアプリが自動レイアウトを使用し、安全な領域と余白のレイアウト ガイドを遵守していれば、iPhone X への対応も比較的簡単です。
以下はサンプルコードです(参照元。
セーフエリアレイアウトガイド
)
:
コードで制約を作成する場合は、UIViewのsafeAreaLayoutGuideプロパティを使用して、関連するレイアウトアンカーを取得します。上記のInterface Builderの例をコードで再現して、どのように見えるか見てみましょう。
ビューコントローラのプロパティとして緑色のビューがあると仮定します。
private let greenView = UIView()
viewDidLoadから呼び出されるビューと制約を設定する関数を用意することもあります。
private func setupView() {
greenView.translatesAutoresizingMaskIntoConstraints = false
greenView.backgroundColor = .green
view.addSubview(greenView)
}
ルートビューのlayoutMarginsGuideを使用して、いつものように先頭と末尾のマージン制約を作成します。
let margins = view.layoutMarginsGuide
NSLayoutConstraint.activate([
greenView.leadingAnchor.constraint(equalTo: margins.leadingAnchor),
greenView.trailingAnchor.constraint(equalTo: margins.trailingAnchor)
])
iOS 11だけをターゲットにしているのでなければ、セーフ エリア レイアウト ガイド制約を #available でラップし、以前の iOS バージョン用の上部および下部レイアウト ガイドにフォールバックする必要があります。
if #available(iOS 11, *) {
let guide = view.safeAreaLayoutGuide
NSLayoutConstraint.activate([
greenView.topAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0),
guide.bottomAnchor.constraintEqualToSystemSpacingBelow(greenView.bottomAnchor, multiplier: 1.0)
])
} else {
let standardSpacing: CGFloat = 8.0
NSLayoutConstraint.activate([
greenView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: standardSpacing),
bottomLayoutGuide.topAnchor.constraint(equalTo: greenView.bottomAnchor, constant: standardSpacing)
])
}
結果
以下
UIView
拡張により、SafeAreaLayout をプログラムで簡単に扱えるようになります。
extension UIView {
// Top Anchor
var safeAreaTopAnchor: NSLayoutYAxisAnchor {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.topAnchor
} else {
return self.topAnchor
}
}
// Bottom Anchor
var safeAreaBottomAnchor: NSLayoutYAxisAnchor {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.bottomAnchor
} else {
return self.bottomAnchor
}
}
// Left Anchor
var safeAreaLeftAnchor: NSLayoutXAxisAnchor {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.leftAnchor
} else {
return self.leftAnchor
}
}
// Right Anchor
var safeAreaRightAnchor: NSLayoutXAxisAnchor {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.rightAnchor
} else {
return self.rightAnchor
}
}
}
のサンプルコードです。 Objective-C :
以下は、Apple Developer Official Documentation for セーフエリア レイアウト ガイド
iPhone-Xのユーザーインターフェースデザインを担当するには、セーフエリアが必要です。以下はその基本的なガイドラインです。
iPhone-XのユーザーインターフェイスをSafe Area Layoutでデザインする方法
関連
-
[解決済み】Xcode - 'NSUnknownKeyException', reason: ... this class is not key value coding-compliant for the key X" エラーの修正方法とは?
-
[解決済み] Xcodeエラー "Could not find Developer Disk Image" が発生する。
-
[解決済み] Xcode 9の問題を修正しました。"iPhoneはビジー状態です。iPhoneのデバッガーサポートを準備中"
-
[解決済み] Xcode 7のエラーです。"Missing iOS Distribution signing identity for ..." (iOS配布用署名IDがありません)
-
[解決済み] 奇妙な不要なXcodeログを隠す
-
[解決済み] Xcodeにおけるバージョンとビルドの比較
-
[解決済み] SwiftでiOSキーボードを任意の場所でタッチして閉じる
-
[解決済み] iOS 11、Apple TV 4Kなどを搭載したXcode 9でワイヤレスデバッグを行う方法とは?
-
[解決済み】Xcodeのプロセス起動に失敗しました。セキュリティ
-
[解決済み】セーフエリアインセットの上下の高さを取得する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
EXC_BAD_ACCESS (code=2, address=0x0)
-
[解決済み] Xcode 6.3 - 現在の iOS Development 証明書または保留中の証明書要求がすでにあります。
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] UITextViewのプレースホルダー
-
[解決済み] コードサインエラーです。期限切れのプロファイルを削除した後、プロビジョニングプロファイルが見つからない
-
[解決済み] インポート vs #インポート - iOS 7
-
[解決済み] UITextBorderStyleNoneを使用してUITextFieldのパディングを設定する
-
[解決済み] セキュリティで保護されたWebサービスにもアクセスするiOSアプリで、Facebook認証を行うためのデザイン
-
[解決済み] swiftで電子メールアドレスを検証する方法は?
-
[解決済み] Cocoapods警告 - CocoaPodsがプロジェクトの基本構成を設定しなかった理由は、プロジェクトに既にカスタム構成が設定されているためです。