web-dev-qa-db-fra.com

Réduire le titre volumineux lors du défilement (non UITableViewController) iOS 11

J'ai un contrôleur de vue intégré à un contrôleur de navigation avec les options de gros titres préférées définies sur true; à l'intérieur du contrôleur de vue, il y a une vue de défilement.

Je souhaite réduire la barre de navigation lors du défilement. 

Comment pourrais-je archiver cela?

XCode 9, Swift 4, iOS 11

8
Jonathan Solorzano

Je n'ai pas réussi à ce que cela fonctionne à l'aide d'un UIScrollView, mais j'ai archivé le fait que cela fonctionne avec d'autres ViewControllers utilisant un UITableView comme première vue.

Si tableView n'est pas la première vue, le titre en grand ne parvient pas à se masquer automatiquement. Vous devez probablement vous assurer que votre tableView est le premier élément du tableau des sous-vues de la vue principale.

 enter image description here

J'espère que cela résout votre problème.

38
Saúl Moreno Abril

Avez-vous essayé quelque chose comme ça? Il convertit le mode d'affichage en gros titre lorsque le contenu est défilé vers le haut.

class P1ViewController: UIViewController, UIScrollViewDelegate
{
    var canTransitionToLarge = false
    var canTransitionToSmall = true    

    func scrollViewDidScroll(_ scrollView: UIScrollView)
    {
        if canTransitionToLarge && scrollView.contentOffset.y <= 0 {
            UIView.animate(withDuration: 0.5) {
                self.navigationItem.largeTitleDisplayMode = .always
            }
            canTransitionToLarge = false
            canTransitionToSmall = true
        }
        else if canTransitionToSmall && scrollView.contentOffset.y > 0 {
            UIView.animate(withDuration: 0.5) {
                self.navigationItem.largeTitleDisplayMode = .never
            }
            canTransitionToLarge = true
            canTransitionToSmall = false
        }
    }
}
5
Kamil Szostakowski

La définition de prefersLargeTitles dans le code m'a permis de réduire le titre de NavBar et de le faire grandir à mesure que vous faites défiler. J'ai remarqué que si vous définissiez la propriété via InterfaceBuilder, la fonctionnalité de réduction ne fonctionnait pas.

 IB Property Inspector

Au lieu de définir dans le code comme

    self.navigationController?.navigationBar.prefersLargeTitles = true
4
billm

Cette façon est travaillée pour moi. J'ai suivi les étapes suivantes: 1- Déplacez TableView en haut de la liste (sous la zone de sécurité) dans la scène du contrôleur de vue .

La capture d'écran de la solution

2
Rouzbeh

J'ai eu le même problème, à cause de la vue dans le contrôleur de vue à partir de UIScrollView et je faisais défiler la hiérarchie en premier. Une fois que c’est le cas, il fonctionne bien avec UIScrollView, WKWebView ou UITextView sans aucune ligne de code.

1
avdyushin

J'ai utilisé quelque chose qui ressemble à la réponse de Kamil Szostakowski avec UICollectionView.

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    UIView.animate(withDuration: 0.5, animations: {
        self.navigationController?.navigationBar.prefersLargeTitles = (velocity.y < 0)
    })
}

Ce n'est peut-être pas si facile mais je n'ai pas encore trouvé la meilleure option.

0
dsk1306

J'ai utilisé les solutions dsk1306, voir ci-dessus. Mais dans mon cas, j'avais une vue Web dans le UIViewController avec le grand titre.

Je devais donc définir le délégué UIWebView ScrollView:

self.webView.scrollView.delegate = self

et

extension MyViewController: UIScrollViewDelegate {

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    if #available(iOS 11.0, *) {
        UIView.animate(withDuration: 0.5, animations: {
            self.navigationController?.navigationBar.prefersLargeTitles = (velocity.y < 0)
        })
    }
}

}
0

Si vous avez un problème de réduction de la barre de navigation racine à partir de scrollView de VC, vous pouvez essayer ceci: Ajoutez UIScrollView à RootVC. Important - UIScrollView doit être une vue racine (index 0) . En VC présenté, nous pouvons utiliser scrollViewDidScroll et définir le décalage sur notre racine UIScrollView . Voir ici avec gif et code capture d'écran (désolé pour le lien, pas assez de réputation)

en presentVC essayez ceci

func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if #available(iOS 11.0, *) {
            let offset = scrollView.contentOffset
            rootVC.scrollView.contentOffset = offset
        }
}
0
vanab

Essayez quelque chose comme ça:

    extendedLayoutIncludesOpaqueBars = true
    scrollView.translatesAutoresizingMaskIntoConstraints = false       
    view.addSubview(scrollView)
    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)
        ])
0
Roman