web-dev-qa-db-fra.com

Affichage du titre personnalisé en tant que titre large dans la nouvelle barre de navigation iOS 11

J'utilise un bouton comme vue du titre de ma UITableViewController qui ouvre une liste déroulante de catégories. La sélection d'une catégorie filtre le contenu de la vue tableau en fonction de la catégorie sélectionnée.

Le bouton indique le nom de la catégorie sélectionnée et une petite flèche, semblable à l'apparence habituelle (ou encore à l'apparence de iBooks? Je ne l'ai pas utilisé depuis un moment). J'aimerais donc qu'il ait le même comportement qu'un titre standard et qu'il soit grand au début et réduit lorsque la vue du tableau défile.

Y a-t-il un moyen de faire cela?

Merci

7
Denis Balko

Il semble que, en raison des nouveaux grands titres, IOS11 exige que les contraintes de la vue personnalisée dans le fichier navigationItem.titleView soient définies. 

Faites ceci par exemple: 

customView.widthAnchor.constraint(equalToConstant: 200).isActive = true
customView.heightAnchor.constraint(equalToConstant: 44).isActive = true

self.navigationItem.titleView = customView

Notez que cela doit être fait pour la largeur et la hauteur. 

Ça devrait marcher. Pas besoin d'ajouter un bouton, du moins dans mon cas ...

Cela a été suggéré par Apple pour vous assurer que vous n'avez pas de vues personnalisées de taille zéro. Voir la diapositive 33 dans https://developer.Apple.com/videos/play/wwdc2017/204/

5
iAmcR

On dirait que les touches sont cassées pour navigationItem.titleView. Gestes, événements tactiles et boutons - rien ne fonctionne

4
Aleksey Mazurenko

Cela ressemble à un bogue dans iOS 11: https://forums.developer.Apple.com/thread/82466

J'ai provisoirement implémenté cette solution de contournement:

    private lazy var navBarActionButtonIOS11: UIButton = {
        button.addTarget(self.navTitleView, action: #selector(self.navTitleView.didTapView), for: .touchUpInside)
        return button
    }()

[...]

        navigationItem.titleView = navTitleView
        if #available(iOS 11.0, *), let navBar = navigationController?.navigationBar {
            navBarActionButtonIOS11.removeFromSuperview()
            navBar.addSubview(navBarActionButtonIOS11)
            navBarActionButtonIOS11.center.x = navBar.center.x
        }

Une autre solution pourrait consister à affecter directement un UIButton à navigationItem.titleView.

J'espère que Apple corrigera ça bientôt!

2
Juan F. Sagasti

Eh bien, j'ai eu le même problème. J'ai des boutons UIB dans UINavigationItem.titleView et ceux-ci ne réagissaient pas du tout aux contacts. Le problème est que la vue où ces boutons sont où de taille (0,0) en raison de la mise en page automatique. Donc, pour résoudre ce problème, vous devez ajouter une vue supplémentaire dans votre vue personnalisée, appelons-la "contentView" et placez tous vos contrôles dans cette contentView. De plus, contentView doit avoir une taille définie avec des contraintes. Le test rapide consiste à ajouter des contraintes de largeur et de hauteur à contentView. Et tout fonctionne à nouveau.

J'espère que cela aide quelqu'un.

1
Juraj Antas