33 votes

Barre de défilement personnalisée pour l'UIView de l'iPhone (pour que les longs défilements ne craignent pas)

Dans un poste, Faire en sorte que les longs défilements sur l'iPhone ne craignent pas Aza Raskin décrit une autre commande de barre de défilement qui permet de mieux se déplacer sur les pages très longues :

Sticky Scroll Indicator

Il n'est pas important que la barre de défilement "reste pendant un certain temps" pour l'activer ; il me suffit de glisser le long du bord droit de l'écran de l'iPhone pour saisir la poignée de la barre de défilement. L'idée est que si je fais glisser la poignée jusqu'aux 3/4 de l'écran physique, je me retrouve aux 3/4 de la page.

L'application Dropbox pour iPhone (elle est géniale, d'ailleurs !) possède exactement ce type de barre de défilement pour les longs documents PDF. Le défilement normal se fait en glissant n'importe où sauf sur la poignée ; en glissant la poignée, la vue se déplace à cet endroit. Cela semble avoir été implémenté "à partir de zéro", car je ne pense pas que le SDK soit suffisamment flexible pour personnaliser le comportement de la barre de défilement existante.

Toutefois, Dropbox utilise les visionneuses de documents natives pour afficher les documents sur l'iPhone, ce qui lui permet d'ajouter la fonctionnalité de barre de défilement. Vous voyez la poignée de la barre de défilement ? Vous pouvez la faire glisser pour vous déplacer rapidement dans le document.

Dropbox scrollbar at the topDropbox scrollbar at the bottom

Ce concept est très similaire à la façon dont les barres d'index fonctionnent dans UITableView (c'est-à-dire Contacts.app) ; l'index apparaît comme une barre sur le côté droit du tableau (par exemple, "a" à "z"), et vous pouvez toucher une étiquette particulière pour sauter à la section cible. Dans ce cas, cependant, une page très longue n'a pas de sections, et cela devrait fonctionner pour un défilement général, pas pour le saut aux sections.

Alors, comment puis-je mettre en œuvre cette méthode de défilement ? Je suis à la recherche d'idées générales et de détails de mise en œuvre spécifiques. Je suis également intéressé par l'existence d'une implémentation open-source (cela semble être un problème/solution à usage général).

7voto

kevboh Points 3282

Une idée générale :

J'ai pris l'application Dropbox (elle est géniale) et j'ai joué un peu avec. Il semble que l'affichage des pdf s'inspire un peu de l'application photo en affichant de manière conditionnelle une barre de navigation et une barre d'outils translucides au toucher, en plus de la prise en charge de la barre de défilement. Je suis presque sûr que ce qui se passe, c'est qu'ils ont un contrôleur de vue personnalisé qui intercepte les touches et réagit en conséquence.

Sur une touche :

  1. S'il s'agit d'un robinet, affichez/masquez la barre de navigation et la barre d'outils.
  2. Si c'est sur l'épurateur, commencez à suivre la toucher et à faire défiler la scrollview/webview (peu importe ce qu'ils sont l'affichage). Je suis sûr que le défilement est quelque chose de simple comme scrollView.contentOffset = CGPointMake(0, (scrubber.y / [UIScreen mainScreen].bounds.size.height) * scrollView.contentSize.height) . 3)
  3. Sinon, le toucher est transmis à la vue fermée.

Il peut y avoir d'autres magies cachées avec l'affichage des PDF (je ne l'ai jamais fait dans cocoa touch) mais quelque chose me dit que c'est leur processus de base.

4voto

Jasconius Points 3257

Je ne connais pas de solutions spécifiques à l'iPhone, mais c'est un sujet ancien et bien traité dans le monde du développement Flash... et vous pourriez probablement extraire une tonne de pseudo code de ce domaine.

Si vous connaissez la hauteur de votre fenêtre, la hauteur de votre contenu et le décalage actuel du contenu (ce qui est le cas), vous disposez de tous les outils nécessaires pour créer un UIView personnalisé qui peut servir de curseur sensible au toucher. Il suffit ensuite de le peindre par-dessus le curseur par défaut.

0voto

Enrico Susatyo Points 3873

Il existe probablement une implémentation open source pour cela. Je n'en connais pas. Peut-être envoyer un courriel aux développeurs de Dropbox ?

Quoi qu'il en soit, la façon dont je m'y prendrais est la suivante :

@interface UICustomisedScrollView : UISCrollView
{
    BOOL showingScroller;
    UIView scroller; //Customise this, either in IB or in viewDidLoad
}

@implementation UICustomisedScrollView

- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view {
    showingScroller = !showingScroller;
    if(showingScroller)
        scroller.hidden = NO;
    else
        scroller.hidden = YES;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if(showingScroller) {
        if(/*the touch is on the scroller*/) {
             /* scrollview.setContentOffset(...) we want to scroll according to how much the user scrolls here */
        }
        //move scroller.frame.origin to where the touch is.
    }
}

Je suppose que ce ne sera pas trop difficile... Mais je n'ai pas encore testé le code ci-dessus. C'est l'idée générale en tout cas =)

0voto

Brandon DuRette Points 3034

Essayez d'utiliser un UIPanGestureRecognizer . Dans votre action, vous pouvez utiliser le locationInView pour déterminer le point que l'utilisateur touche. Faites-le lorsque l'état est UIGestureRecognizerStateBegan et s'il est suffisamment proche du côté de la vue, mettre en œuvre un défilement rapide. Sinon, mettez en place un défilement lent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X