web-dev-qa-db-fra.com

Le guide d'agencement des zones sûres ne fonctionne pas pour UITableViewController dans le storyboard

On dirait que UITableViewController n'a pas guide de disposition de zone sécurisée pour définir les marges inférieure et supérieure de la vue du tableau sous forme de collpes avec disposition inférieure dans iPhone X. et la marge inférieure. Excepté le contrôleur UITableView, veuillez aider à résoudre ce problème. 

Pour référence, je joins une capture d'écran de iPhoneX. vous pouvez voir que la chaîne "wheat" ne rentre pas dans la zone de sécurité inférieure.

 enter image description here

6
SachinVsSachin

Je crois que cela se produit puisque la vue du contrôleur de vue (qui prend toujours la taille de l'écran en entier) est la tableview

Utilisez soit une UIViewController et ajoutez une vue tabulaire sous sa view (et ajoutez des contraintes pour respecter la zone de sécurité inférieure) 

ou 

Définissez les encarts de contenu de la vue table avec:

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

si vous utilisez cette dernière version et ciblez les versions iOS moins de 11 ans, assurez-vous de le vérifier avec:

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

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

J'ai également remarqué cette propriété de tableview dans iOS 11 (mais pas de description: /): insetsContentViewsToSafeArea

Je ne l'ai pas encore essayé, mais vous pouvez l'essayer. Peut-être que c'est ce dont vous avez besoin hors de la boîte

10
giorashc

C’est ma solution actuelle pour forcer la zone de sécurité supérieure et inférieure dans UITableViewController. Vous devez d’abord l’intégrer dans UINavigationController (masquer la barre de navigation s’il n’est pas nécessaire), puis:

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!
    ])
}

Il est juste triste de devoir écrire tout ce code. Si quelqu'un connaît une méthode plus simple pour y parvenir, merci de nous le montrer.

P.S. J'ai utilisé cette petite extension UIView ici:

extension UIView {
    func addSubview(_ child: UIView, constraints: [NSLayoutConstraint]) {
        addSubview(child)
        child.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate(constraints)
    }
}
2
tadija