web-dev-qa-db-ja.com

セーフエリアレイアウトガイドがストーリーボードのUITableViewControllerに対して機能しない

UITableViewControllerには、安全なエリアレイアウトガイドがないようです(-===-)は、iPhone X、すべてのビューコントローラーは、ストーリーボードのセーフエリアレイアウトガイドで上マージンと下マージンに問題なく機能しています。 UITableViewコントローラーを除き、この問題の解決にご協力ください。

参考までに、iPhoneXのスクリーンショットを添付しています。文字列 "wheat"が下部安全領域の内側に収まらないことがわかります。

enter image description here

10
SachinVsSachin

ビューコントローラー(常に画面全体のサイズをとります)のビューは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

まだ試していませんが、試してみてください。多分これはあなたが箱から出して必要なものです

12
giorashc

これは、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)
    }
}
2
tadija