UIScrollView - snap de contrôle lors de la décélération
La UIScrollView a beaucoup d'informations disponibles pour le programmeur, mais je ne vois pas d'une manière évidente pour le contrôle de l'emplacement de la butée de commande à la suite d'une décélération à partir d'un rouleau geste.
Fondamentalement, je voudrais la scrollview de composant logiciel enfichable à des régions spécifiques de l'écran. L'utilisateur peut faire défiler comme d'habitude, mais quand ils arrêter le défilement de la vue doit composant logiciel enfichable pour le plus pertinent endroit, et dans le cas d'un mouvement rapide geste de la décélération d'arrêt à ces endroits.
Est-il un moyen facile de faire quelque chose comme cela, ou dois-je envisager la seule façon de réaliser cet effet d'écrire une coutume de défilement de contrôle?
OriginalL'auteur Nippysaurus | 2011-05-17
Vous devez vous connecter pour publier un commentaire.
Depuis la UITableView est un UIScrollView sous-classe, vous pourriez mettre en œuvre les UIScrollViewDelegate méthode:
Puis calculer ce que le plus proche de la cible souhaitée, le décalage du contenu que vous voulez, et que sur le inout CGPoint paramètre.
J'ai juste essayé et ça fonctionne bien.
Tout d'abord, récupérer le non guidées décalage comme ceci:
Puis comprendre par le biais de certains de mathématiques, où vous voulez qu'il soit, en notant la hauteur de la table d'en-tête. Voici un exemple de mon code traitant personnalisé cellules représentant les États-unis:
La dernière ligne ci-dessus, effectivement écrit la valeur de retour dans le inout paramètre, qui raconte le défilement de vue que c'est le y-offset vous le souhaitez accrocher.
Enfin, si vous avez affaire à un récupérés résultats contrôleur, et vous voulez savoir ce que viens de cassé, vous pouvez faire quelque chose comme ceci (dans mon exemple, la propriété "états" est le FRC États-unis). J'utilise cette information pour définir un bouton titre:
HORS-SUJET NOTE: Comme vous l'avez probablement deviné, les "log4Debug" déclarations ne sont rien d'enregistrement. D'ailleurs, je suis en utilisant le Bûcheron, mais je préfère la syntaxe de la commande de la vieille Log4Cocoa.
Lorsque l'on pousse le défilement viewcontroller la contentOffset sera un élément de l'UINavigationBar de la hauteur et de l'origine. (je ne sais pas pourquoi il fait ça comme ça n'a aucun sens mais c'est ce qu'elle fait)
OriginalL'auteur idStar
Après la
scrollViewDidEndDecelerating:
etscrollViewDidEndDragging:willDecelerate:
(le dernier, juste au moment où la décélération de paramètre estNO
), vous devez régler lecontentOffset
paramètre de votreUIScrollView
à la position désirée.Vous aussi, vous connaissez la position actuelle en cochant la
contentOffset
propriété de votre scrollview, puis de calculer le plus proche de la région désirée que vous avezBien que vous n'avez pas à créer votre propre défilement de contrôle, vous devrez manuellement faites défiler jusqu'à la position souhaitée
OriginalL'auteur Felipe Sabino
À ajouter à ce que felipe dit, j'ai récemment créé un tableau de la vue qui s'aligne sur les cellules de manière similaire, les UIPicker.
Un savant scrollview délégué est certainement le chemin à faire (et vous pouvez aussi le faire sur un uitableview, puisque c'est juste une sous-classe de uiscrollview).
J'ai eu ce fait, une fois le défilement de la vue a commencé en décélération (c'est à dire après scrollViewDidEndDragging:willDecelerate: est appelé), répondant à scrollViewDidScroll: et le calcul de la diff avec la précédente défilement de l'événement.
Lorsque l'écart est inférieur à dire 2 à 5 de pixels, j'ai vérifier le plus proche de la cellule, puis attendez jusqu'à ce que la cellule a été adoptée par quelques pixels, puis revenir en arrière dans l'autre sens avec setContentOffset:animation:.
Qui crée un peu d'effet de rebond qui est très agréable pour l'expérience utilisateur, car il donne un bon feedback sur le magnétisme.
Vous devez être intelligent et ne pas faire n'importe quoi lors de la table est de rebondir en haut ou en bas (en comparant l'offset à 0 ou à la taille du contenu va vous dire que).
Cela fonctionne assez bien dans mon cas, parce que les cellules sont de petite taille (environ 80-100px de haut), vous pourriez rencontrer des problèmes si vous avez un régulier de défilement de la vue avec de plus grandes zones de contenu.
Bien sûr, vous ne serez pas toujours ralentir passé une cellule, dans ce cas, je viens de faire défiler la plus proche de la cellule, et l'animation saccadée. S'avère avec le bon réglage, il est à peine arrive jamais, donc je suis cool avec ça.
Passer quelques heures de réglage les valeurs réelles selon les spécificités de votre écran et vous pouvez obtenir quelque chose de décent.
J'ai aussi essayé l'approche naïve, appelant setContentOffset:animation: sur scrollViewDidEndDecelerating: mais il crée vraiment une drôle d'animation (ou de la simple confusion sauter si vous n'animez pas), que s'aggrave le bas de la rampe de décélération est (vous serez en sautant d'un mouvement lent à un beaucoup plus rapide).
Donc pour répondre à la question:
- non, il n'y a pas de moyen facile de le faire, ça va prendre un certain temps à polir les valeurs réelles de l'algorithme précédent, ce qui pourrait ne pas fonctionner du tout sur votre écran,
- ne pas essayer de créer votre propre défilement de la vue, vous allez juste perdre du temps et de mal réinventer un beau morceau de l'ingénierie apple a créé avec des camions remplis de bug. La scrollview délégué est la clé de votre problème.
OriginalL'auteur kra
Essayer quelque chose comme cela:
Cela prend avantage de l'int de la chute de l'après-chiffres décimaux. Suppose également tous vos points de vue sont alignés de 0,0 et seul le contentOffset est ce qu'il fait apparaître dans différents domaines.
Remarque: brancher le délégué et cela fonctionne parfaitement bien. Vous obtenez une version modifiée - moi, juste les constantes lol. J'ai renommé les variables de sorte que vous pouvez le lire, il est facile
OriginalL'auteur Stephen J