Comment append un searchBar avec scopebar dans un NavigationBar où le navBar augmente automatiquement sa hauteur et montre le scopeBar

J'ai lu toutes les questions sur stackoverflow mais aucun d'entre eux ne pouvait résoudre mon problème. J'ai créé un UICollectionView et ancré un searchBar à l'intérieur de la navigationBar sans utiliser Storyboards!

class UserSearchController: UICollectionViewController ,.. {.. lazy var searchBar: UISearchBar = { let sb = UISearchBar() sb.placeholder = "Enter username" sb.barTintColor = UIColor.gray UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).backgroundColor = UIColor.rgb(red: 230, green: 230, blue: 230) sb.delegate = self sb.showsCancelButton = true return sb }() .... // adding the searchBar to the collectionView as subView and anchoring it to the navigationBar 

entrez la description de l'image ici

La barre de search est affichée à l'intérieur de la barre de navigation et tout fonctionne correctement. Le problème se produit lorsque j'essaie d'append une barre de scope à ma barre de search. J'ai ajouté les propriétés suivantes à ma barre de search

  sb.showsScopeBar = true sb.scopeButtonTitles = ["Username", "Hashtag"] 

Le scopeBar est caché derrière le navigationBar et le navBar n'augmente pas automatiquement sa taille. Vous voyez juste un fond gris.

entrez la description de l'image ici

Ajouter mon code à un UiViewController simple fonctionne très bien

Ce code fonctionne à l'intérieur d'un VIewController normal, où searchBar est ajouté en tant que sous-vue et ancré à la vue.

  lazy var searchBar: UISearchBar = { let sb = UISearchBar() sb.placeholder = "Enter username" sb.barTintColor = UIColor.gray UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).backgroundColor = UIColor.rgb(red: 230, green: 230, blue: 230) sb.delegate = self sb.scopeButtonTitles = ["Username", "Hashtag"] sb.tintColor = UIColor.black sb.barTintColor = UIColor.lightGray return sb }() public func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool { searchBar.showsScopeBar = true searchBar.sizeToFit() searchBar.setShowsCancelButton(true, animated: true) return true } func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { searchBar.showsScopeBar = false searchBar.endEditing(true) } 

Mon searchBar ressemble à ceci. Si vous commencez à taper le scopeBar apparaît et si vous click annuler, il disparaît. Je veux la même mais seulement à l'intérieur de la NavBar:

entrez la description de l'image ici entrez la description de l'image ici

Comment est-il possible d'append un searchBar avec scopeBar à l'intérieur de la navigationBar sans Storyboards. Il n'y a pas de moyen facile. S'il vous plaît pouvez-vous vous référer à mon code et utiliser mon code pour me montrer comment cela fonctionne. J'ai également essayé d'augmenter la taille de la navigationBar mais cela devrait fonctionner automatiquement et je ne sais pas si c'est la bonne approche.

Je pense que c'est le genre de mise en œuvre que vous searchz:

Votre controller de segment

 // ( Declare Globaly ) var yourSegmentController = UISegmentedControl() yourSegmentController.addTarget(self, action: #selector(ParentClass.filterChanged(_:)), for: .touchUpInside) 

Ensuite, vous devrez save vos classs UICollectionViewCell personnalisées avec votre UICollectionView . Pour ce faire, viewDidLoad ou toute méthode d'initialisation utilisée dans le module dans UICollectionView vous avez UICollectionView :

 self.yourCollectionView.register(YourCustomUserCellClassHere.self, forCellWithReuseIdentifier: NSSsortingngFromClass(YourCustomUserCellClassHere)) self.yourCollectionView.register(YourCustomHashtagCellClassHere.self, forCellWithReuseIdentifier: NSSsortingngFromClass(YourCustomHashtagCellClassHere)) 

Enfin, dans votre méthode de délégué cellForItemAt , procédez comme suit pour voir quel filter est sélectionné et renvoyez les cellules en conséquence:

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { var cellToReturn = UICollectionViewCell() // USERS if yourSegmentController.selectedSegmentIndex == 0 { let customUserCell = self.yourCollectionView.dequeueReusableCell( withReuseIdentifier: NSSsortingngFromClass(YourCustomUserCellClassHere), for: indexPath) as? YourCustomUserCellClassHere // Do what you want with your custom cell here... cellToReturn = customUserCell } // HASHTAGS else if yourSegmentController.selectedSegmentIndex == 1 { let customHashtagCell = self.yourCollectionView.dequeueReusableCell( withReuseIdentifier: NSSsortingngFromClass(YourCustomHashtagCellClassHere), for: indexPath) as? YourCustomHashtagCellClassHere // Do what you want with your custom cell here... cellToReturn = customHashtagCell } return cellToReturn } 

Cela va vérifier pour voir quel filter est sélectionné et ensuite returnner la cellule qui convient au filter.

Gardez aussi à l'esprit chaque fois que l'user change votre filter de segment, vous devrez actualiser UICollectionView .

Actualisez-le comme ceci:

 // Put this method at the same level where your cellForItemAt function is but not inside func filterChanged (_ sender:UISegmentedControl) { self.yourCollectionView.reloadData() }