it-roy-ru.com

Руководство по макету безопасной области не работает для UITableViewController в раскадровке

Похоже, что UITableViewController не имеет руководства по макету безопасной области для установки верхнего и нижнего полей представления таблицы в виде коллизий с макетом снизу в iPhone X, все контроллеры представления работают нормально с руководством по компоновке безопасной области в раскадровке сверху и нижнее поле. За исключением контроллера UITableView, пожалуйста, помогите решить эту проблему. 

Для справки прилагаю скриншот iPhoneX. там вы можете увидеть строку "wheat", которая не помещается внутри нижней безопасной области.

 enter image description here

6
SachinVsSachin

Я полагаю, что это происходит, так как представление контроллера представления (который всегда принимает весь размер экрана) является tableview

Либо используйте UIViewController и добавьте табличное представление под его view (и добавьте ограничения для соблюдения нижней безопасной области) 

или же 

Установите вкладки содержимого табличного представления с помощью:

tableView.contentInset = UIEdgeInsetsMake(0, 0, UIApplication.shared.keyWindow!.safeAreaInsets.bottom, 0.0);

если вы используете последнюю и целевую версии iOS до 11, убедитесь, что вы проверили это:

     var safeAreaBottom: CGFloat = 0.0 
     if #available(iOS 11.0, *) {
         safeAreaBottom = UIApplication.shared.keyWindow!.safeAreaInsets.bottom
     }

     tableView.contentInset = UIEdgeInsetsMake(0, 0, safeAreaBottom, 0.0);

Я также заметил это свойство tableview в iOS 11 (но без описания: /): insetsContentViewsToSafeArea

Я еще не пробовал, но вы можете попробовать. Может быть, это то, что вам нужно из коробки

10
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