Mobile Safari vous permet de changer de page en entrant une sorte de vue de pagination horizontale UIScrollView avec un contrôle de page en bas.
J'essaie de reproduire ce comportement particulier où un UIScrollView à défilement horizontal montre une partie du contenu de la vue suivante.
L'exemple fourni par Apple: PageControl montre comment utiliser un UIScrollView pour la pagination horizontale, mais toutes les vues occupent toute la largeur de l'écran.
Comment obtenir un UIScrollView pour afficher du contenu de la vue suivante comme le fait Safari mobile?
ios
iphone
cocoa-touch
uiscrollview
premier répondeur
la source
la source
Réponses:
Un
UIScrollView
avec la pagination activée s'arrêtera à des multiples de sa largeur (ou hauteur) de cadre. La première étape consiste donc à déterminer la largeur souhaitée de vos pages. Faites que la largeur duUIScrollView
. Ensuite, définissez les tailles de votre sous-vue, quelle que soit la taille dont vous avez besoin, et définissez leurs centres en fonction de multiples de laUIScrollView
largeur de.Ensuite, puisque vous voulez voir les autres pages, bien sûr, mis
clipsToBounds
àNO
comme mhjoy déclaré. La partie astuce consiste maintenant à le faire défiler lorsque l'utilisateur commence le glissement en dehors de la plage duUIScrollView
cadre de. Ma solution (lorsque j'ai dû le faire très récemment) était la suivante:Créez une
UIView
sous - classe (c'est-à-direClipView
) qui contiendra lesUIScrollView
et ses sous-vues. Essentiellement, il devrait avoir le cadre de ce que vous supposeriezUIScrollView
qu'il aurait dans des circonstances normales. Placez leUIScrollView
au centre duClipView
. Assurez-vous que leClipView
'sclipsToBounds
est défini surYES
si sa largeur est inférieure à celle de sa vue parent. En outre, leClipView
nécessite une référence auUIScrollView
.La dernière étape consiste à remplacer
- (UIView *)hitTest:withEvent:
à l'intérieur du fichierClipView
.Cela élargit fondamentalement la zone tactile de la
UIScrollView
au cadre de la vue de son parent, exactement ce dont vous avez besoin.Une autre option serait de sous
UIScrollView
-classer et de remplacer sa- (BOOL)pointInside:(CGPoint) point withEvent:(UIEvent *) event
méthode, mais vous aurez toujours besoin d'une vue de conteneur pour effectuer le découpage, et il peut être difficile de déterminer quand retourner enYES
fonction uniquement duUIScrollView
cadre de.REMARQUE: vous devriez également jeter un oeil à hitTest: withEvent: modification de Juri Pakaste si vous rencontrez des problèmes avec l'interaction de l'utilisateur de sous-vue.
la source
UIScrollView
sous - classe pour le chargement paresseux des vues (inlayoutSubviews
), et utilisé aclippingRect
pour faire lespointInside:withEvent:
tests. Fonctionne très bien et aucune vue de conteneur supplémentaire n'est requise.UIScrollView
sous - classe comme @ohhorob mais avec une vue de conteneur pour écrêtage et le retour[super pointInside:CGPointMake(self.contentOffset.x + self.frame.size.width/2, self.contentOffset.y + self.frame.size.height/2) withEvent:event];
enpointInside:withEvent:
. Cela fonctionne très bien et il n'y a aucun problème d'interaction avec l'utilisateur mentionné dans la réponse de @ JuriPakaste.- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
ajout de UIScrollViewDelegate dans iOS5 signifie que vous n'avez plus à passer par cette palabre.La
ClipView
solution ci-dessus a fonctionné pour moi, mais j'ai dû faire une-[UIView hitTest:withEvent:]
implémentation différente . La version d'Ed Marty ne fonctionnait pas avec les vues de défilement verticales que j'ai à l'intérieur de l'horizontale.La version suivante a fonctionné pour moi:
la source
Définissez la taille du cadre de scrollView comme la taille de vos pages serait:
Vous pouvez maintenant effectuer un panoramique
self.view
et le contenu de scrollView défilera.Utilisez également
scrollView.clipsToBounds = NO;
pour éviter de couper le contenu.la source
J'ai fini par utiliser le UIScrollView personnalisé moi-même car c'était la méthode la plus rapide et la plus simple qui me semblait. Cependant, je n'ai vu aucun code exact, donc je pensais partager. Mes besoins étaient pour un UIScrollView qui avait un petit contenu et donc le UIScrollView lui-même était petit pour obtenir l'effet de pagination. Comme le message l'indique, vous ne pouvez pas faire glisser votre doigt. Mais maintenant vous pouvez.
Créez une classe CustomScrollView et une sous-classe UIScrollView. Ensuite, tout ce que vous avez à faire est d'ajouter ceci dans le fichier .m:
Cela vous permet de faire défiler d'un côté à l'autre (horizontal). Ajustez les limites en conséquence pour définir votre zone tactile de balayage / défilement. Prendre plaisir!
la source
J'ai fait une autre implémentation qui peut renvoyer le scrollview automatiquement. Il n'est donc pas nécessaire d'avoir un IBOutlet qui limitera la réutilisation dans le projet.
la source
J'ai une autre modification potentiellement utile pour l'implémentation de ClipView hitTest. Je n'aimais pas avoir à fournir une référence UIScrollView au ClipView. Mon implémentation ci-dessous vous permet de réutiliser la classe ClipView pour étendre la zone de test de succès de quoi que ce soit, sans avoir à lui fournir une référence.
la source
J'ai implémenté la suggestion de vote positif ci-dessus, mais
UICollectionView
j'utilisais tout ce qui sortait du cadre de l'écran. Cela faisait que les cellules voisines n'étaient rendues hors limites que lorsque l'utilisateur faisait défiler vers elles, ce qui n'était pas idéal.Ce que j'ai fini par faire, c'est émuler le comportement d'un scrollview en ajoutant la méthode ci-dessous au délégué (ou
UICollectionViewLayout
).Cela évite entièrement la délégation de l'action de balayage, ce qui était également un bonus. Le
UIScrollViewDelegate
a une méthode similaire appeléescrollViewWillEndDragging:withVelocity:targetContentOffset:
qui pourrait être utilisée pour paginer UITableViews et UIScrollViews.la source
Activez le déclenchement d'événements de tap sur les vues enfants de la vue de défilement tout en prenant en charge la technique de cette question SO. Utilise une référence à la vue de défilement (self.scrollView) pour la lisibilité.
Ajoutez ceci à votre vue enfant pour capturer l'événement tactile:
(Ceci est une variante de la solution de user1856273. Nettoyé pour plus de lisibilité et incorporé le correctif de bogue de Bartserk. J'ai pensé à modifier la réponse de user1856273 mais c'était un changement trop important à faire.)
la source
ma version En appuyant sur le bouton posé sur le parchemin - travail =)
mais seul [[self subviews] objectAtIndex: 0] doit être un scroll
la source
Voici une réponse Swift basée sur la réponse d'Ed Marty, mais incluant également la modification par Juri Pakaste pour permettre les tapotements de boutons, etc. dans la vue de défilement.
la source