web-dev-qa-db-fra.com

Titre de la barre de navigation iOS 11 grande vitesse inattendue

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 = truenavigationController?.navigationItem.largeTitleDisplayMode = .always

Je reçois ce que je désirais. enter image description here

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?

enter image description here

enter image description here

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.

enter image description here

35
Seop Yoon

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.

8
Seop Yoon

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
37
Roman

J'ai trouvé ce problème aussi.

dans Interface Builder

  1. Sélectionnez votre "viewController"
  2. Inspecteur d'attributs cocher "Sous les barres opaques" et "Sous les barres supérieures"
  3. Faites en sorte que les contraintes principales de votre deuxième élément scrollView soient "SuperView" et non "SafeArea"
21
user8637708

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:

coche translucide

6
JWhitey

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.

5
Artjom Bastun