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
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:
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.
Scénarimage 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.
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
Mais si vous fermez le menu coulissant et rouvrez-le alors
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 }