J'essaie d'implémenter le titre natif de grande barre de navigation iOS 11 sur ma nouvelle application. En appelant les fonctions ci-dessous dans viewDidLoad ():
navigationController?.navigationBar.prefersLargeTitles = true
navigationController?.navigationItem.largeTitleDisplayMode = .always
Mais, lorsque je commence à faire défiler vers le haut (la seule vue de la vue principale est une vue de défilement), le défilement fait disparaître le titre volumineux à une vitesse plus rapide que le défilement réel avec le doigt. (c’est-à-dire que si je déplace 2 cm à l’écran, la vue de défilement défile en fait de plus de 2 cm, jusqu’à ce que le titre large soit réduit à la taille "habituelle".)
Ci-dessous, le gif de mon application en train de défiler. En fait, je me déplace très peu, et cela fait automatiquement défiler autant. Cela diffère des applications conçues par Apple (l’app store par exemple, affiché en dessous de mon application).
Quelqu'un at-il une solution pour résoudre ce comportement anormal?
EDIT: À la demande, j'ajoute la hiérarchie de vues actuelle. Il n'y a rien de spécial dans mon code, je viens de définir le titre et l'indicateur pour prefersLargeTitles
.
Je corrige cela depuis quelques jours et j'ai trouvé une solution de contournement.
D'abord, qu'est-ce qui se passait?
C'est le UIScrollView
qui ne fonctionne pas bien avec le largeTitle. Puisqu'il y a défilement vers le haut dans la vue défilement en même temps que la barre de navigation devient plus petite, il y a deux fois le défilement par rapport au défilement réel.
Je l'ai confirmé en réglant intentionnellement:
scrollView.contentOffset.y = scrollView.contentOffset.y * 0.5
Cela a effectivement fait bouger comme souhaité. Mais cela ne pouvait pas résoudre le problème dans son ensemble car cela ne produisait pas une transition en douceur lorsque l'on passait d'une grande barre de navigation à une petite barre de navigation. Vous pouvez essayer le code ci-dessous.
if scrollView.contentOffset.y > 0 {
if self.navigationController!.navigationBar.frame.size.height > 44.0 {
scrollView.contentOffset.y = scrollView.contentOffset.y * 0.5
}
}
Cela fonctionnait bien lorsque vous faites défiler lentement, mais lorsque vous vous dirigez vers le bas, il agit d'abord lentement (lorsque la hauteur de navigation est grande), puis accélère ensuite.
SOLUTION DE CONTOURNEMENT
Autrement dit, vous NE POUVEZ PAS utiliser UIScrollView
avec la grande barre de navigation iOS 11. Vous devriez utiliser UITableViewController
à la place.
Étant donné que ma vue est composée de plusieurs UICollectionViews
horizontaux répartis verticalement, j’utilise UITableView
avec différentes sections pour former l’UI à l’aide du storyboard. Si vous utilisez UITableViewController
, il fonctionne comme vous le souhaitez.
AppStore et toutes les autres applications natives conçues par Apple doivent le faire de cette façon.
J'ai résolu le problème avec ces contraintes:
NSLayoutConstraint.activate([
scrollView.topAnchor.constraint(equalTo: view.topAnchor),
scrollView.leftAnchor.constraint(equalTo: view.leftAnchor),
scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
scrollView.rightAnchor.constraint(equalTo: view.rightAnchor)
])
Vous devez également définir cette propriété sur votre sous-classe UIViewController:
extendedLayoutIncludesOpaqueBars = YES
J'ai trouvé ce problème aussi.
dans Interface Builder
J'ai constaté que cela se produit lorsque la barre de navigation contient de gros titres et n'est pas translucide . Si vous utilisez un objet CollectionView ou TableView et que celui-ci est contraint à la zone de sécurité ou à son aperçu, il doit gérer les encarts à votre place.
Pour les vues de défilement, consultez la documentation Apple). Il existe de nouvelles variables (telles que contentInsetAdjustmentBehavior ) pour les modifications de la zone sécurisée introduites dans iOS. 11: https://developer.Apple.com/documentation/uikit/uiscrollview
Pour rendre la barre de navigation transparente
Dans viewDidLoad (), essayez d’ajouter:
navigationController?.navigationBar.isTranslucent = true
Ou cochez cette case dans IB:
Le problème en cas de double vélocité peut être que votre taille d'affichage est plus petite que celle du contrôleur de navigation et que vous avez une vue hiérarchique comme (vous pouvez le vérifier dans le débogueur d'une vue).
V:|-[navbar]-[view]-|
ainsi, lorsque vous faites défiler le cadre de votre vue change lors de la modification du décalage du contenu, il double la vélocité.
extendedLayoutIncludesOpaqueBars = true
devrait aider.