web-dev-qa-db-fra.com

La barre de navigation du grand titre iOS 11 s'enclenche au lieu d'une transition en douceur

Je suis confronté à un problème où la grande barre de navigation par titre s'effondre très brusquement lors du défilement sur un UITableView intégré à l'intérieur d'un UIViewController. Le problème semble se produire uniquement lors du défilement vers le haut sur l'écran. Lorsque vous faites défiler l'écran vers le bas, le titre passe en douceur pour redevenir grand, mais pas l'inverse.

Ce problème ne se produit PAS si vous utilisez un UITableViewController.

Voici le comportement normal et attendu lors du défilement à l'intérieur d'un UITableViewController.

iOS 11 UITableView inside of a UIViewController (broken abrupt transition when scrolling)

Et voici la transition brisée et abrupte lors de l'utilisation d'un UITableView à l'intérieur d'un UIViewController.

iOS 11 UITableViewController (transitioning properly)

Voici le code de l'implémentation cassée:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 12
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Basic", for: indexPath)

        cell.textLabel?.text = "Title \(indexPath.row)"

        return cell
    }

}

La barre de navigation a préfère les grands titres cochée et l'élément de navigation a grand titre réglé sur Automatique.

Le code et la configuration des deux exemples ci-dessus sont exactement les mêmes, sauf que celui-ci est un UITableViewController et un UITableView à l'intérieur d'un UIViewController.

J'ai également observé que le comportement cassé ne se produit PAS si le contenu de UITableView ne dépasse pas la hauteur de la vue. Mais une fois qu'il y a plus de cellules que ne peut en contenir l'écran, il se casse.

Une idée si je fais quelque chose de mal ou s'il s'agit d'un bug iOS 11?

24
Villarrealized

J'ai rencontré le même problème - j'avais UIViewController intégré dans UINavigationController, le UIViewController avait une vue de table avec des contraintes de début, de fin, de haut et de bas pour zone de sécurité . L'ensemble de la vue de la table s'est comporté de manière agitée. L'astuce consistait à changer la contrainte supérieure de tableview en superview .

Ici, j'ai enregistré la modification de la contrainte changement de contrainte de bogue iOS 11 de tableview

36
Soolar

Mettez cette ligne de code sur votre UIViewController contenant UITableView et fonctionne très bien pour moi.

Swift

extendedLayoutIncludesOpaqueBars = true;

Objectif c

self.extendedLayoutIncludesOpaqueBars = YES;

Définissez l'espace supérieur UITableView AutoLayout sur "Superview" au lieu de "Safe Area"

28
Filippo

Dans Interface Builder:

  1. Sélectionnez votre "viewController".
  2. L'inspecteur d'attributs coche "Sous les barres opaques" et "Sous les barres supérieures".
  3. Faites vos principales contraintes de votre deuxième élément scrollView à "SuperView" et non à "SafeArea".

Ça a marché avec moi.

Référence

2
FarouK

J'ai eu un problème similaire et je l'ai résolu en supprimant UINavigationBar.appearance().isTranslucent = false de mon AppDelegate.

2
fl034

La réponse de Soolar est juste, mais je ne sais pas comment le réparer dans le storyboard. Enfin, j'ai résolu le problème de la solution de Roman dans une autre question, en ajoutant:

    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)
    ])

dans viewDidLoad.

Réponse originale: https://stackoverflow.com/a/48321447/1386369

0
Yongqiang Zhou