J'ai un UITableView
créé par programme. Cette UITableView
fusionne avec l'indicateur de la maison sur un appareil iPhone X.
Comment puis-je résoudre ce problème?
Par programme, définissez l'ancre inférieure de tableview avec l'ancre inférieure de SafeAreaLayout.
Voici un exemple / code de test, comment programmer la disposition de la zone de security par rapport aux éléments de l'interface.
if #available(iOS 11, *) { let guide = view.safeAreaLayoutGuide NSLayoutConstraint.activate([ table.topAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0), guide.bottomAnchor.constraintEqualToSystemSpacingBelow(table.bottomAnchor, multiplier: 1.0) ]) } else { let standardSpacing: CGFloat = 8.0 NSLayoutConstraint.activate([ table.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: 0), bottomLayoutGuide.topAnchor.constraint(equalTo: table.bottomAnchor, constant: 0) ]) }
Voici des references utiles (réponses):
Vous devez utiliser safeAreaLayoutGuide dans iOS11 et définir les contraintes avec safeArea
conséquent votre contenu ne sera pas safeArea
.
Pour définir des contraintes dans UITableView
–
ObjC
self.tableView.translatesAutoresizingMaskIntoConstraints = NO; UILayoutGuide * guide = self.view.safeAreaLayoutGuide; [self.tableView.leadingAnchor constraintEqualToAnchor:guide.leadingAnchor].active = YES; [self.tableView.trailingAnchor constraintEqualToAnchor:guide.trailingAnchor].active = YES; [self.tableView.topAnchor constraintEqualToAnchor:guide.topAnchor].active = YES; [self.tableView.bottomAnchor constraintEqualToAnchor:guide.bottomAnchor].active = YES;
Swift 4
tableView.translatesAutoresizingMaskIntoConstraints = false if #available(iOS 11.0, *) { let guide = self.view.safeAreaLayoutGuide tableView.trailingAnchor.constraint(equalTo: guide.trailingAnchor).isActive = true tableView.leadingAnchor.constraint(equalTo: guide.leadingAnchor).isActive = true tableView.bottomAnchor.constraint(equalTo: guide.bottomAnchor).isActive = true tableView.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true } else { NSLayoutConstraint(item: tableView, atsortingbute: .leading, relatedBy: .equal, toItem: view, atsortingbute: .leading, multiplier: 1.0, constant: 0).isActive = true NSLayoutConstraint(item: tableView, atsortingbute: .trailing, relatedBy: .equal, toItem: view, atsortingbute: .trailing, multiplier: 1.0, constant: 0).isActive = true NSLayoutConstraint(item: tableView, atsortingbute: .bottom, relatedBy: .equal, toItem: view, atsortingbute: .bottom, multiplier: 1.0, constant: 0).isActive = true NSLayoutConstraint(item: tableView, atsortingbute: .top, relatedBy: .equal, toItem: view, atsortingbute: .top, multiplier: 1.0, constant: 0).isActive = true }
Si votre controller est dérivé de UI Table ViewController (pas UIViewController), les cellules ne semblent pas bien en bas de l'écran.
Je suppose que vous utilisez un controleur de navigation, dans ce cas ma solution est:
//dummy view var bottomX: UIView? override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if Device.isIPhoneX { bottomX = UIView(frame: CGRect(x: 0, y: self.tableView.bounds.size.height - 34, width: self.tableView.bounds.size.width, height: 34)) bottomX!.backgroundColor = self.tableView.backgroundColor self.navigationController?.view.addSubview(bottomX!) } }
et n'oublie pas d'enlever la vue fictive
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) bottomX?.removeFromSuperview() }
et le résultat est:
cette solution n'est pas très belle, mais ça marche pour l'instant