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.
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
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)
}
}