45 votes

Titre de la barre de navigation iOS 11 grande vitesse inattendue

Je suis en train de mettre en œuvre les iOS 11 natif de grandes de navigation de la barre de titre sur ma nouvelle application. En appelant les fonctions ci-dessous dans le viewDidLoad():

navigationController?.navigationBar.prefersLargeTitles = true navigationController?.navigationItem.largeTitleDisplayMode = .always

Je fais ce que j'ai désiré. enter image description here

Mais, quand j'ai commencer à faire défiler vers le haut (le seul point de vue à l'intérieur de la vue principale est un défilement de l'affichage), la vitesse de défilement fait le gros titre de disparaître à une vitesse plus rapide que le réel en faisant défiler avec le doigt. (qui est, si je me déplace de 2cm sur l'écran, le défilement de l'affichage défile en fait plus de 2cm, jusqu'à ce que le grand titre se réduit pour le "comme d'habitude" de la taille.)

Ci-dessous est le gif de mon application en cours de défilement. J'ai fait déplacer très peu, et il se déplace automatiquement jusqu'à ce que beaucoup. Ce qui diffère de l'Apple applications (app store, par exemple, montré ci-dessous mon application).

Quelqu'un aurait-il une solution pour résoudre ce comportement anormal?

enter image description here

enter image description here

EDIT: Par demande, je suis en ajoutant le point de Vue actuel de la hiérarchie. Il n'y a rien de spécial dans mon code, j'ai juste mis le titre et le drapeau de l' prefersLargeTitles.

enter image description here

49voto

Roman Points 423

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
 

35voto

user8637708 Points 137

J'ai trouvé ce problème aussi.

Dans Interface Builder

  1. Sélectionnez votre "viewController"
  2. Coche "Sous les barres opaques" et "Sous les barres supérieures" dans l'Inspecteur des attributs
  3. Faites que les contraintes principales de votre deuxième élément scrollView soient "SuperView" et non "SafeArea"

9voto

Seop Yoon Points 1294

J'ai été de débogage ce pour un couple de jours, et j'ai trouvé une solution de contournement.

Tout D'Abord, Ce Qui Se Passait?

C'est l' UIScrollView qui ne fonctionne pas bien avec le largeTitle. Puisqu'il y a de défilement sur le défilement de la vue en même temps que la barre de navigation de plus en plus petits, il existe deux fois la vitesse de défilement par rapport à l'effectif de défilement.

J'ai confirmé cette intention de réglage:

scrollView.contentOffset.y = scrollView.contentOffset.y * 0.5

De ce fait bouger comme souhaité. Mais, cela ne résout pas le problème, tout le problème, car il n'a pas produit une transition en douceur tout en allant de la grande barre de navigation à petite barre de navigation. Vous pouvez essayer le code ci-dessous sur.

if scrollView.contentOffset.y > 0 {
  if self.navigationController!.navigationBar.frame.size.height > 44.0 {
    scrollView.contentOffset.y = scrollView.contentOffset.y * 0.5
  }
}

Ce qui a fonctionné " ok " lorsque défile lentement, mais quand vous jeter à la baisse, il s'agit d'abord lents (alors que la navigation de la hauteur est grande), et puis accélère par la suite.

Solution de CONTOURNEMENT

Tout simplement, vous NE pouvez pas utiliser UIScrollView avec l'iOS 11 grande barre de navigation. Vous devez utiliser UITableViewController à la place.
Depuis mon point de vue est composée de plusieurs horizontal UICollectionViews répartis le long de la verticale, j'ai utilisé UITableView avec les différentes sections de la forme de l'INTERFACE utilisateur à l'aide de storyboard. Si vous utilisez UITableViewController, il effectue comme souhaité.
AppStore et tous les autres Apple fait des applications natives doivent le faire de cette façon.

7voto

JWhitey Points 106

J'ai trouvé ce qui se passe quand la barre de navigation a gros titres et non translucide. Si vous utilisez un CollectionView ou TableView, et il est limité à la zone de sécurité ou de ses superview, alors il doit gérer les encarts pour vous.

Pour faire défiler les vues, découvrez l'Apple docs, il y a quelques nouvelles variables (comme contentInsetAdjustmentBehavior) pour la zone de sécurité les modifications qui ont été introduites dans iOS 11: https://developer.apple.com/documentation/uikit/uiscrollview

Pour rendre la Barre de Navigation Translucide

Dans le viewDidLoad(), essayez d'ajouter:

navigationController?.navigationBar.isTranslucent = true

Ou définir cette marque de l'IB:

translucide coche

6voto

Artjom Bastun Points 51

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X