UITableViewControllerには、安全なエリアレイアウトガイドがないようです(-===-)は、iPhone X、すべてのビューコントローラーは、ストーリーボードのセーフエリアレイアウトガイドで上マージンと下マージンに問題なく機能しています。 UITableViewコントローラーを除き、この問題の解決にご協力ください。
参考までに、iPhoneXのスクリーンショットを添付しています。文字列 "wheat"が下部安全領域の内側に収まらないことがわかります。
ビューコントローラー(常に画面全体のサイズをとります)のビューはtableview
であるため、これは起こると思います。
UIViewController
を使用して、そのview
の下にテーブルビューを追加します(そして、下部のセーフエリアを考慮して制約を追加します)。
または
テーブルビューのコンテンツインセットを次のように設定します。
tableView.contentInset = UIEdgeInsetsMake(0, 0, UIApplication.shared.keyWindow!.safeAreaInsets.bottom, 0.0);
後者を使用し、11未満のiOSバージョンをターゲットにする場合は、次の方法で確認してください。
var safeAreaBottom: CGFloat = 0.0
if #available(iOS 11.0, *) {
safeAreaBottom = UIApplication.shared.keyWindow!.safeAreaInsets.bottom
}
tableView.contentInset = UIEdgeInsetsMake(0, 0, safeAreaBottom, 0.0);
IOS 11のtableview
のこのプロパティにも気付きました(ただし、説明はありません:/):insetsContentViewsToSafeArea
まだ試していませんが、試してみてください。多分これはあなたが箱から出して必要なものです
これは、UITableViewController
の上部および下部の安全領域を強制するための現在の修正です。まず、それをUINavigationController
に埋め込む必要があります(不要な場合はナビゲーションバーを非表示にします)。次に:
override func viewDidLoad() {
super.viewDidLoad()
configureFakeSafeArea()
}
@available(iOS 11.0, *)
override func viewSafeAreaInsetsDidChange() {
super.viewSafeAreaInsetsDidChange()
topSafeAreaHeight?.constant = view.safeAreaInsets.top
bottomSafeAreaHeight?.constant = view.safeAreaInsets.bottom
}
private var topSafeAreaHeight: NSLayoutConstraint?
private var bottomSafeAreaHeight: NSLayoutConstraint?
private func configureFakeSafeArea() {
guard let view = navigationController?.view else {
return
}
let topSafeArea = UIView()
topSafeArea.backgroundColor = tableView.backgroundColor
var topConstant: CGFloat = 0
if #available(iOS 11.0, *) {
topConstant = view.safeAreaInsets.top
}
topSafeAreaHeight = topSafeArea.heightAnchor.constraint(equalToConstant: topConstant)
view.addSubview(topSafeArea, constraints: [
topSafeArea.leadingAnchor.constraint(equalTo: view.leadingAnchor),
topSafeArea.trailingAnchor.constraint(equalTo: view.trailingAnchor),
topSafeArea.topAnchor.constraint(equalTo: view.topAnchor),
topSafeAreaHeight!
])
let bottomSafeArea = UIView()
bottomSafeArea.backgroundColor = tableView.backgroundColor
var bottomConstant: CGFloat = 0
if #available(iOS 11.0, *) {
bottomConstant = view.safeAreaInsets.bottom
}
bottomSafeAreaHeight = bottomSafeArea.heightAnchor.constraint(equalToConstant: bottomConstant)
view.addSubview(bottomSafeArea, constraints: [
bottomSafeArea.leadingAnchor.constraint(equalTo: view.leadingAnchor),
bottomSafeArea.trailingAnchor.constraint(equalTo: view.trailingAnchor),
bottomSafeArea.bottomAnchor.constraint(equalTo: view.bottomAnchor),
bottomSafeAreaHeight!
])
}
このコードをすべて記述しなければならないのは残念なことです。そのため、より簡単な方法を知っている人がいれば、ぜひ教えてください。
追伸この小さなUIView
拡張機能をここで使用しました:
extension UIView {
func addSubview(_ child: UIView, constraints: [NSLayoutConstraint]) {
addSubview(child)
child.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate(constraints)
}
}