UITableview merge avec l'indicateur de la maison sur l'iPhone X

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?

entrez la description de l'image ici

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):

  • Utiliser la mise en forme de zone sécurisée par programme
  • Zone de security de Xcode 9

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.

les cellules et l'indicateur de la maison regardent ensemble

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:

cellules derrière la vue factice

cette solution n'est pas très belle, mais ça marche pour l'instant