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
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.
J'espère que cela résout votre problème.
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
}
}
}
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.
Au lieu de définir dans le code comme
self.navigationController?.navigationBar.prefersLargeTitles = true
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 .
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.
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.
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)
})
}
}
}
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
}
}
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)
])