Dans la nouvelle application iPhone Facebook iOS7, lorsque l'utilisateur fait défiler vers le haut, il navigationBar
se cache progressivement jusqu'à un point où il disparaît complètement. Ensuite, lorsque l'utilisateur fait défiler vers le bas, le navigationBar
s'affiche progressivement.
Comment implémenteriez-vous ce comportement vous-même? Je connais la solution suivante, mais elle disparaît immédiatement et elle n'est pas du tout liée à la vitesse du geste de défilement de l'utilisateur.
[navigationController setNavigationBarHidden: YES animated:YES];
J'espère que ce n'est pas un doublon car je ne suis pas sûr de la meilleure façon de décrire le comportement «expansion / contraction».
ios
iphone
objective-c
ios7
uinavigationbar
El Mocoso
la source
la source
Réponses:
La solution donnée par @peerless est un bon début, mais elle ne lance une animation que chaque fois que le glissement commence, sans tenir compte de la vitesse du défilement. Cela se traduit par une expérience plus saccadée que celle que vous obtenez dans l'application Facebook. Pour correspondre au comportement de Facebook, nous devons:
Tout d'abord, vous aurez besoin de la propriété suivante:
Et voici les
UIScrollViewDelegate
méthodes:Vous aurez également besoin de ces méthodes d'assistance:
Pour un comportement légèrement différent, remplacez la ligne qui repositionne la barre lors du défilement (le
else
bloc entrantscrollViewDidScroll
) par celle-ci:Cela positionne la barre en fonction du dernier pourcentage de défilement, au lieu d'un montant absolu, ce qui entraîne un fondu plus lent. Le comportement original ressemble plus à Facebook, mais j'aime aussi celui-ci.
Remarque: cette solution est uniquement disponible sur iOS 7+. Assurez-vous d'ajouter les vérifications nécessaires si vous prenez en charge les anciennes versions d'iOS.
la source
customView
.ScrollView
scontentSize
est plus petit que frame, l'animation du glissement ne fonctionne pas. Assurez-vous également de réinitialiser l'alpha de tous les éléments de navigation à 1,0 poviewDidDisappear
.EDIT: uniquement pour iOS 8 et supérieur.
Vous pouvez essayer d'utiliser
Travaille pour moi.
Si votre codage en swift, vous devez utiliser cette méthode (à partir de https://stackoverflow.com/a/27662702/2283308 )
la source
Voici une autre implémentation: TLYShyNavBar v1.0.0 est sorti!
J'ai décidé de créer les miennes après avoir essayé les solutions fournies, et pour moi, elles fonctionnaient mal, avaient une barrière élevée d'entrée et un code de plaque de chaudière, ou n'avaient pas de vue d'extension sous la barre de navigation. Pour utiliser ce composant, il vous suffit de:
Oh, et c'est testé au combat dans notre propre application.
la source
extendedLayoutIncludesOpaqueBars
c'était régléYES
sur monUICollectionViewController
Vous pouvez jeter un œil à mon GTScrollNavigationBar . J'ai sous-classé UINavigationBar pour le faire défiler en fonction du défilement d'un UIScrollView.
Remarque: Si vous avez une barre de navigation OPAQUE, la vue de défilement doit se développer lorsque la barre de navigation devient HIDDEN. C'est exactement ce que fait GTScrollNavigationBar. (Tout comme dans Safari par exemple sur iOS.)
la source
iOS8 inclut des propriétés pour que la barre de navigation se cache gratuitement. Il y a une vidéo WWDC qui le démontre, recherchez «Afficher les progrès du contrôleur dans iOS 8».
Exemple :
}
Autres propriétés:
Trouvé via http://natashatherobot.com/navigation-bar-interactions-ios8/
la source
J'ai une sorte de solution rapide et sale pour cela. Je n'ai fait aucun test approfondi mais voici l'idée:
Cette propriété conservera tous les éléments de la barre de navigation pour ma classe UITableViewController
Dans la même classe UITableViewController que j'ai:
Ce n'est que pour ios> = 7, c'est moche je sais mais c'est un moyen rapide d'y parvenir. Tous les commentaires / suggestions sont les bienvenus :)
la source
Cela fonctionne pour iOS 8 et supérieur et garantit que la barre d'état conserve toujours son arrière-plan
Et si vous souhaitez afficher la barre de navigation lorsque vous appuyez sur la barre d'état, vous pouvez le faire:
la source
Voici mon implémentation: SherginScrollableNavigationBar .
Dans mon approche que j'utilise
KVO
pour observerUIScrollView
l'état de, il n'est donc pas nécessaire d'utiliser un délégué (et vous pouvez utiliser ce délégué pour tout ce dont vous avez besoin).la source
Veuillez essayer cette solution et dites-moi pourquoi ce n'est pas aussi bon que les réponses précédentes.
la source
Une façon dont j'ai accompli ceci est la suivante.
Enregistrez votre contrôleur de vue pour être le
UIScrollViewDelegate
de votreUITableView
par exemple.À partir de ces
UIScrollViewDelegate
méthodes, vous pouvez obtenir le nouveau contentOffset et traduire votreUINavigationBar
up ou down en conséquence.La définition de l'alpha des sous-vues peut également être effectuée en fonction de certaines valeurs de seuil et de certains facteurs que vous pouvez définir et calculer.
J'espère que ça aide!
la source
En plus de la réponse d'Iwburk, j'ai ajouté ce qui suit pour résoudre le problème alpha sur les barres de navigation non personnalisées et pour réinitialiser la barre de navigation dans la méthode viewWillDisappear:
la source
Je cherchais une solution qui permette n'importe quel style et n'importe quel comportement. Vous remarquerez que le comportement de condensation des barres est différent dans de nombreuses applications différentes. Et bien sûr, l'apparence de la barre est totalement différente entre les applications.
J'ai créé une solution pour ce problème avec https://github.com/bryankeller/BLKFlexibleHeightBar/
Vous pouvez définir vos propres règles de comportement pour contrôler comment et quand la barre rétrécit et grossit, et vous pouvez définir exactement comment vous voulez que les sous-vues de la barre réagissent à la condensation ou à la croissance de la barre.
Jetez un œil à mon projet si vous voulez beaucoup de flexibilité pour créer n'importe quel type de barre d'en-tête que vous pouvez imaginer.
la source
J'essayais d'émuler ce comportement dans une situation où j'avais besoin d'un en-tête personnalisé assis sur un UITableView. J'ai roulé ma propre barre de "navigation" car elle se trouve sous un tas d'autres choses sur la page et je voulais que les en-têtes de section suivent le comportement "d'ancrage" par défaut. Je pense que j'ai trouvé un moyen assez intelligent et succinct d'ajuster un UITableView / UIScrollView avec un autre objet dans un style similaire à celui vu dans Facebook / Instagram / Chrome / etc. applications.
Dans mon fichier .xib, mes composants sont chargés dans une vue de forme libre: http://imgur.com/0z9yebJ (désolé, je n'ai pas le représentant pour insérer des images)
Notez que, dans la barre latérale gauche, le tableau est rangé derrière la vue d'en-tête principale. Vous ne pouvez pas le dire sur la capture d'écran, mais il a également la même position y que la vue d'en-tête principale. Comme il s'étend hors de vue, la propriété contentInset sur UITableView définie sur 76 (la hauteur de la vue d'en-tête principale).
Pour faire glisser la vue d'en-tête principale vers le haut à l'unisson avec UIScrollView, j'utilise les méthodes scrollViewDidScroll de UIScrollViewDelegate pour effectuer des calculs et modifier le contentInset de UIScrollView ainsi que le cadre de la vue d'en-tête principale.
La première instruction if fait l'essentiel du gros du travail, mais j'ai dû inclure les deux autres pour gérer les situations où l'utilisateur fait glisser avec force et les valeurs initiales contentOffset envoyées à scrollViewDidScroll sont en dehors de la plage du premier if instruction .
En fin de compte, cela fonctionne très bien pour moi. Je déteste charger mes projets avec un tas de sous-classes gonflées. Je ne peux pas dire si c'est la meilleure solution en termes de performances (j'ai toujours hésité à mettre du code dans scrollViewDidScroll car il est appelé tout le temps), mais l'empreinte du code est la plus petite que j'ai vue dans aucun solution à ce problème et cela n'implique pas d'imbriquer un UITableView dans un UIScrollView (Apple déconseille cela dans la documentation et les événements tactiles finissent un peu génial sur l'UITableView). J'espère que cela aide quelqu'un!
la source
HidingNavigationBar est un excellent projet qui masque la barre de navigation et la barre d'onglets si vous le souhaitez.
https://github.com/tristanhimmelman/HidingNavigationBar
la source
J'ai essayé d'implémenter GTScrollNavigationBar mais mon application m'a obligé à modifier les contraintes de mise en page automatique. J'ai décidé de mettre un exemple de mon implémentation sur GitHub au cas où quelqu'un d'autre devrait le faire avec la mise en page automatique. L'autre problème que j'ai eu avec la plupart des autres implémentations est que les gens ne définissent pas les limites de la vue de défilement pour éviter l'effet de défilement de parallaxe que vous créez pendant que vous faites défiler et ajustez la taille de la vue de défilement simultanément.
Consultez JSCollapsingNavBarViewController si vous devez le faire avec la disposition automatique. J'ai inclus deux versions, une avec la barre de navigation uniquement et une autre avec une sous-barre sous la barre de navigation qui s'effondre avant de réduire la barre de navigation.
la source
Je l'ai essayé de cette façon, j'espère que cela aidera. implémentez simplement le code dans la méthode déléguée et définissez-le sur la vue / sous-vue souhaitée
la source
Une extension de la réponse de @Iwburk ... Au lieu de changer l'origine de la barre de navigation, j'avais besoin d'agrandir / réduire la taille de la barre de navigation.
Cela ne fonctionne pas encore avec la
stoppedScrolling
méthode, je poste une mise à jour quand je l'aila source
Toutes ces approches semblent trop compliquées ... Alors naturellement, j'ai construit la mienne:
la source
frame
propriété?J'ai trouvé toutes les réponses données en Objective-C. C'est ma réponse dans Swift 3. C'est un code très générique et peut être utilisé directement. Il fonctionne avec UIScrollView et UITableView.
La logique de réglage de l'alpha sur les éléments de navigation est copiée à partir de la réponse @ WayneBurkett et réécrite dans Swift 3.
la source