La scope de la barre de search Swift 4 – iOS 11 n'apparaîtra pas comme elle le devrait

J'ai une application qui fonctionne bien et sans aucun problème sur iOS 10 mais avec iOS 11 et Xcode Beta 5, j'ai ce problème étrange avec la scope de la barre de search où la barre de scope semble être coupée du bas. (C'était la même chose avec toutes les versions de Xcode beta et iOS 11) Je serais vraiment très heureux si quelqu'un pouvait me mettre dans la bonne direction. Merci

Écran initial

Ci-dessus, vous pouvez voir ce que je vois quand j'appuie sur le button du menu hamburger. Pas de problème ici .. barre de search a également une scope qui apparaît lorsque cliqué sur. Je ne l'ai pas configuré pour apparaître par programmation.Mais je suppose que c'est son comportement par défaut lorsque les titres des buttons d'étendue sont définies.

Le problème:

problème

Lorsque je clique sur la barre de search pour entrer des informations, je vois l'écran ci-dessus. Sur iOS 10, je n'ai eu aucun problème. Mais maintenant, avec iOS 11, quoi que je fasse, je ne peux tout simplement pas le faire fonctionner comme sur iOS 10. Barre de search apparaît comme si elle était coupée du bas.

C'est ainsi qu'il apparaît dans iOS 10 et je veux qu'il soit dans iOS 11.

workingInIOS10

Scénarimage de l'écran

vue de storyboard de l'écran

Je colle le code pertinent ici.

class SlideMenuViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UISearchControllerDelegate,UIGestureRecognizerDelegate{ let searchController = UISearchController(searchResultsController: nil) @IBOutlet var sview: UIView! @IBOutlet var tableView: UITableView! override func viewWillAppear(_ animated: Bool) { //some non relevant code before this if sview.subviews .contains(searchController.searchBar) { print("Already contains") } else { sview.addSubview(searchController.searchBar) print(searchController.searchBar.showsScopeBar) searchController.searchBar.sizeToFit() searchController.searchBar.frame.size.width = view.frame.size.width searchController.searchBar.barTintColor = searchBarTintColor searchController.searchBar.tintColor = searchTintColor } } override func viewDidLoad() { //some other code searchController.searchBar.delegate = self searchController.searchBar.scopeButtonTitles = [NSLocalizedSsortingng("İsimlerde", comment: ""), NSLocalizedSsortingng("Açıklamalarda", comment: "")] searchController.searchBar.returnKeyType = UIReturnKeyType.done searchController.searchResultsUpdater = self searchController.dimsBackgroundDuringPresentation = false definesPresentationContext = true //some other code } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if searchController.isActive && searchController.searchBar.text != "" { switch scpglobal { case NSLocalizedSsortingng("İsimlerde", comment: ""): return filteredIsimler.count case NSLocalizedSsortingng("Açıklamalarda", comment: ""): return filteredAciklamalar.count default: print("Tableview default") } } return isimlerArray.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { //some code about search here but nothing that will result in that behaviour } func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { print("cancel") searchController.searchBar.text = "" } func updateSearchResults(for searchController: UISearchController) { let searchBar = searchController.searchBar let scope = searchBar.scopeButtonTitles![searchBar.selectedScopeButtonIndex] filterContentForSearchText(searchText: searchController.searchBar.text!, scope: scope) tableView.reloadData() } } extension SlideMenuViewController:UISearchBarDelegate { func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) { filterContentForSearchText(searchText: searchController.searchBar.text!, scope: searchController.searchBar.scopeButtonTitles![selectedScope]) } } 

Edit: C'est ce qui se passe si j'ajoute des contraintes à la barre de search. D'abord tout semble bien.

withConstraints1st

Ensuite, lorsque vous click la barre de search, cela se produit .. Barre de search se déplace hors de l'écran. Voir la flèche

withConstraints2nd

Mais si vous fermez le menu coulissant et rouvrez-le alors

withConstraints3rd

Tout fonctionne bien jusqu'à ce que vous click le button Annuler. Après cela, vous devez tout recommencer pour voir la barre de search fonctionner.

Code pour les contraintes

  searchController.searchBar.translatesAutoresizingMaskIntoConstraints = false sview.addConstraint(NSLayoutConstraint(item: searchController.searchBar, atsortingbute: .top, relatedBy: .equal, toItem: sview, atsortingbute: .top, multiplier: 1, constant: 0)) sview.addConstraint(NSLayoutConstraint(item: searchController.searchBar, atsortingbute: .bottom, relatedBy: .equal, toItem: sview, atsortingbute:.bottom, multiplier: 1, constant: 0)) sview.addConstraint(NSLayoutConstraint(item: searchController.searchBar, atsortingbute: .leading, relatedBy: .equal, toItem: sview, atsortingbute: .leading,multiplier: 1, constant: 0)) sview.addConstraint(NSLayoutConstraint(item: searchController.searchBar, atsortingbute: .trailing, relatedBy: .equal, toItem: sview, atsortingbute: .trailing, multiplier: 1, constant: 0)) 

Consultez la video de la WWDC 2017: WWDC 2017

Vous devriez faire quelque chose comme ceci:

  if #available(iOS 11.0, *) { navigationItem.searchController = searchController navigationItem.hidesSearchBarWhenScrolling = false } else { tableView.tableHeaderView = searchController.searchBar } 

puis faites les changements dont vous avez besoin en conséquence.

J'ai été en mesure de résoudre le problème en remplaçant searchController avec un searchBar personnalisé.

 let searchBar = UISearchBar(frame:CGRect(x: 0, y: 0, width: 266, height: 100)) 

Attention cependant, ne pas oublier d'utiliser

 searchBar.sizeToFit 

à l'intérieur searchBarShouldBeginEditing et searchBarShouldEndEditing sinon vous pourriez avoir des problèmes d'interface user étranges, surtout si vous utilisez le

 searchBar.showsScopeBar = true 

Par conséquent, si vous rencontrez un problème similaire, supprimez searchController et implémentez un searchBar et ses methods déléguées. Il ne vous donnera pas la même animation scopeBar mais au less cela fonctionne. Un autre inconvénient de cette méthode est, si vous avez le searchBar.isTranslucent = true vous pouvez voir le fantôme d'un autre scopeBar dans le searchBar. Alors assurez-vous que

 searchBar.isTranslucent = false 

Si quelqu'un trouve une meilleure façon de résoudre ce problème, je suis tout ouïe …

Exemple de configuration de délégué

  func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool { searchBar.showsScopeBar = true searchBar.sizeToFit() searchBar.setShowsCancelButton(true, animated: true) return true } func searchBarShouldEndEditing(_ searchBar: UISearchBar) -> Bool { searchBar.showsScopeBar = false searchBar.sizeToFit() searchBar.setShowsCancelButton(false, animated: true) return true }