iOS 11 de la barre de navigation de la hauteur de la personnalisation
Maintenant dans iOS 11, le sizeThatFits
méthode n'est pas appelée à partir de UINavigationBar
sous-classes. Modification de l'image de UINavigationBar
causes des problèmes et des mauvais encarts.
Donc, toutes les idées comment personnaliser la barre de navigation de taille maintenant?
- La seule nouvelle API avec iOS 11 pour l'instant avec UINavigationBar est :
open var prefersLargeTitles: Bool
et la valeur par défaut estfalse
. - découvrez pour les problèmes connus dans les notes de version en version bêta.
- J'ai le même problème, ma taille personnalisée barre de navigation est très glitchy et mon ancien code ne fonctionne pas correctement.
- C'est toujours un problème avec la version Bêta 2, même si les problèmes signalés dans la Bêta 1 ont soi-disant été fixé: sizeThatFits n'est pas invoquée par UINavigationBar sous-classes.
- J'ai retesté trop, et la question reste :(.
- Non, il n'est pas fixé dans la version Bêta 2
- Testé avec la Beta 3, encore une fois, pas de chance ....
- Dans la Bêta 3, sizeThatFits est invoquée, mais ne semble pas faire n'importe quoi avec une hauteur personnalisée. A cette question effectivement référencé dans les notes de version?
- Pour moi, le UINavigationBar est redimensionnée, seulement le point de vue pense toujours que c'est la valeur par défaut 44 pixels de hauteur. Donc, ma vue se dessiner sous l'personnalisé navigationBar. p.s. L'étendue bords sont sur
none
. - Mise à jour: Toujours le même problème en Bêta 4
- Yup, personnalisée-hauteur des barres de navigation sont encore très glitch dans la bêta 4, malgré la libération des notes indiquant: "barres de Navigation devrait maintenant ressembler à corriger. (32076094)". Je suggère le dépôt d'un double rapport de bug.
UINavigationBar
intentionnellement n'utilise plussizeThatFits
afin de déterminer sa taille en raison de l'évolution dynamique de la barre de navigation hauteurs dans iOS 11 avec les gros titres. Donc, je ne sais pas ce qui peut être fait pour obtenir une hauteur fixe dans iOS 11, autres que de construire votre propre barre de navigation qui n'est pas unUINavigationBar
. Je vous encourage à déposer une demande d'amélioration de demander une API pour influencer la barre de navigation de la hauteur pour iOS 11+.- voir le même comportement dans la bêta 4 - était bien jusqu'à ce que la bêta 4, la barre augmente en taille, mais le fond ne l'est pas avec elle. J'ai connecté un bug avec l'ID 33539673
- Voici ma solution : stackoverflow.com/questions/46325181/...
InformationsquelleAutor | 2017-06-06
Vous devez vous connecter pour publier un commentaire.
Selon les développeurs d'Apple (look ici, ici et ici), la modification de la barre de navigation de hauteur dans iOS 11 n'est pas pris en charge. Ici ils suggèrent de faire des solutions de contournement comme avoir une vue sous la barre de navigation (mais à l'extérieur), puis retirez la barre de navigation de la frontière. Comme un résultat, vous aurez dans ce storyboard:
ressembler à ceci sur l'appareil:
Maintenant, vous pouvez faire une solution de contournement qui a été suggéré dans les autres réponses: créer une sous-classe personnalisée de
UINavigationBar
, ajouter votre personnalisé grand sous-vue à elle, remplacersizeThatFits
etlayoutSubviews
, puis définissezadditionalSafeAreaInsets.top
pour la navigation de la télécommande à la différencecustomHeight - 44px
, mais le bar la vue sera toujours la valeur par défaut 44px, même si visuellement tout sera parfait. Je n'ai pas essayer primordialsetFrame
, ça marche peut-être, cependant, en tant que développeur Apple a écrit dans l'un des liens ci-dessus: "...et ce n'est [pris en charge] changer le cadre d'une barre de navigation qui est détenue par un UINavigationController (la manette de navigation seront heureux de stomp sur votre image est modifié à chaque fois qu'il le juge bon de le faire)."Dans mon cas, la solution de contournement ci-dessus fait des vues à ressembler à ceci (debug pour afficher les frontières):
Comme vous pouvez le voir, l'aspect visuel est très bon, la
additionalSafeAreaInsets
correctement poussé le contenu vers le bas, la grande barre de navigation est visible, cependant j'ai un bouton personnalisé dans ce bar et la zone qui va en vertu de la norme 44 pixel de la barre de navigation est cliquable (en vert dans l'image). Touche en dessous de la barre de navigation standard hauteur n'atteint pas ma coutume sous-vue, j'ai donc besoin de la barre de navigation lui-même à être redimensionnée, qui l'Apple aux développeurs de dire n'est pas pris en charge.code override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { return subviews.reduce(super.hitTest(point, with: event)) { (result, subview) in return result ?? subview.hitTest(convert(point, to: subview), with: event) } }
désolé pour la mise en formeMis À Jour À 07 Jan 2018
Ce code est le soutien XCode 9.2, iOS 11.2
J'ai eu le même problème. Ci-dessous est ma solution. Je suppose que la hauteur de la taille est de 66.
Veuillez choisir ma réponse si cela vous aide.
Créer CINavgationBar.swift
Ensemble Storyboard
Personnalisé NavigationBar classe
Ajouter TestView + Set SafeArea
ViewController.swift
SecondViewController.swift
Jaune est barbackgroundView. Noir opacité est BarContentView.
Et j'ai enlevé BarContentView de backgroundColor.
Que C'est.
setAdditionalSafeAreaInsets:
m'a aidé! 🙂 Donc, la barre de navigation dans iOS 11 est plus courte en termes de hauteur de celui d'iOS 10?layoutSubviews()
à de nombreuses reprises, que l'application de gel.Ajouté:
Le problème est résolu dans iOS 11 beta 6 ,de sorte que le code ci-dessous est d'aucune utilité ^_^
Réponse originale à cette question:
Résolu avec le code ci-dessous :
(Je veux toujours le navigationBar.hauteur + barre d'état.height == 64 si le caché de la barre de statut est vrai ou pas)
subview
est une UIView. Comment faites-voussubview.height
plus tard??cela fonctionne pour moi :
Simplifié avec Swift 4.
Avec prépondérant
-layoutSubviews
et-setFrame:
vous devriez vérifier le nouvellement ajouté UIViewController deadditionalSafereaInsets
propriété (La Documentation D'Apple) si vous ne voulez pas que le redimensionnement de la barre de navigation de cacher votre contenu.addionalSafeAreaInsets
et, en particulier, comment permettre iOS 10 et au-dessous qui ne prennent pas en charge cette propriétéaddionalSafeAreaInsets
et, en particulier, comment permettre iOS 10 et au-dessous qui ne prennent pas en charge cette propriétéBien que c'est corrigé dans la version bêta 4, il semble que l'image d'arrière-plan de la barre de navigation, ne l'est pas avec le réel (on peut le vérifier en regardant dans la prise de position de la hiérarchie de la visionneuse). Une solution de contournement pour le moment est de remplacer
layoutSubviews
dans votre personnaliséUINavigationBar
et ensuite utiliser ce code:Si vous avez remarqué, le fond de la barre, en fait, a un décalage de
-20
pour la faire apparaître, derrière la barre d'état, de sorte que le calcul ci-dessus ajoute que dans.sur Xcode 9 Beta 6, j'ai toujours le problème. Le Bar ressemble toujours 44 pixels de hauteur et il est placé sous la barre de statut.
Afin de résoudre des problèmes que j'ai fait une sous-classe avec @strangetimes code (Swift)
et je place la barre inférieure de la barre d'état
C'est ce que j'utilise. Il travaille pour un contenu régulier (44.0 px) si vous utilisez
UISearchBar
comme titre ou d'autres vues que de modifier la taille de la barre de contenu, vous devez mettre à jour les valeurs en conséquence. À utiliser à vos propres risques, car on pourrait frein à un certain point.C'est la barre de navigation 90,0 px de hauteur codé en dur, en travaillant à la fois sur iOS 11 et les versions plus anciennes. Vous pourriez avoir à ajouter des encarts de la
UIBarButtonItem
pour pré iOS 11 de regarder la même chose.Et vous l'ajoutez à un
UINavigationController
sous-classe comme ceci:safeAreaInsets
bien sur UIView de mettre à jour votre zone de sécurité.J'ai été doublement de la hauteur de ma barre de navigation afin que je puisse ajouter une ligne d'icônes d'état au-dessus de la valeur par défaut des contrôles de navigation par sous-classement UINavigationBar et à l'aide de sizeThatFits pour remplacer la hauteur. Heureusement, cela a le même effet, et est plus simple, avec moins d'effets secondaires. Je l'ai testé avec iOS 8 à 11. Mettez ceci dans votre vue-contrôleur:
Cela fonctionne bien pour l'ordinaire de la barre de navigation. Si votre utilisation de la LargeTitle cela ne marchera pas parce que le titleView la taille n'est pas fixe, hauteur de 44 points. Mais pour l'affichage normal, cela devrait être suffisant.
Comme @frangulyan apple a suggéré d'ajouter une vue de dessous de la barre de navigation et de cacher la mince ligne (image de l'ombre). C'est ce que j'ai trouvé ci-dessous. J'ai ajouté une uiview à la navigationItem de titleView, puis ajouté un imageView à l'intérieur que uiview. J'ai enlevé la ligne mince (image de l'ombre). Le uiview j'ai ajouté est le même couleur que la barre de navigation. J'ai ajouté un uiLabel à l'intérieur de ce point de vue et c'est tout.
Voici l'image 3d. La vue étendue est derrière le usernameLabel en dessous de la barre de navigation. Il est gris et a une mince ligne d'en dessous de lui. Juste ancre de votre collectionView ou que ce soit en dessous de la mince separatorLine.
Les 9 étapes sont expliquées au-dessus de chaque ligne de code: