UIScrollView horizontale de pagination comme Mobile Safari onglets
Mobile Safari vous permet de basculer entre les pages par l'entrée d'une sorte de UIScrollView horizontale pagination de vue avec un contrôle de page en bas.
Je suis en train d'essayer de reproduire ce comportement particulier où un défilement horizontal UIScrollView montre une partie de la prochaine vue du contenu.
La Pomme de l'exemple fourni par: contrôle pagecontrol montre comment utiliser un UIScrollView horizontal de recherche, mais tous les points de vue de prendre toute la largeur de l'écran.
Comment puis-je obtenir un UIScrollView pour afficher le contenu de certains cours de la prochaine vue comme le navigateur Safari mobile ne?
- Juste une pensée... essayez de faire défiler la vue des limites plus petit que l'écran, et la tripoter de partout à l'obtention de la vue à afficher correctement. (et l'ensemble de défilement de la vue clipsToBounds ou PAS)
- Je voulais avoir des pages plus la la uiscrollview largeur (défilement horizontal). Et mjhoy est pensé en fait m'a aidé!
- Connexes est la Pagination UIScrollView en incréments plus petits que la taille du contenu.
Vous devez vous connecter pour publier un commentaire.
Un
UIScrollView
avec la pagination est activée, s'arrêter à des multiples de sa largeur (ou la hauteur). Donc, la première étape est de comprendre comment la largeur que vous voulez que vos pages. Faire que la largeur de laUIScrollView
. Ensuite, définissez votre sous-vue de la taille mais grand vous en avez besoin pour être, et l'ensemble de leurs centres basée sur des multiples de laUIScrollView
's largeur.Alors, puisque vous voulez voir les autres pages, bien sûr,
clipsToBounds
àNO
comme mhjoy déclaré. Le truc maintenant la partie est de la faire défiler lorsque l'utilisateur démarre le glisser en dehors de la plage de laUIScrollView
s'cadre. Ma solution (quand j'ai eu à faire cette très récemment) ont été comme suit:Créer un
UIView
sous-classe (c'est à direClipView
) qui contiendra lesUIScrollView
et il est sous-vues. Essentiellement, il devrait avoir l'image de ce que l'on pourrait supposer laUIScrollView
auraient dans des conditions normales. Placez leUIScrollView
dans le centre de laClipView
. Assurez-vous que leClipView
'sclipsToBounds
est fixé àYES
si sa largeur est inférieure à celle de son parent vue. Aussi, leClipView
a besoin d'une référence à laUIScrollView
.L'étape finale consiste à remplacer
- (UIView *)hitTest:withEvent:
à l'intérieur de laClipView
.En fait cela élargit la zone tactile de la
UIScrollView
à l'image de son parent vue, exactement ce dont vous avez besoin.Une autre option serait de la sous-classe
UIScrollView
et de remplacer son- (BOOL)pointInside:(CGPoint) point withEvent:(UIEvent *) event
méthode, cependant, vous aurez toujours besoin d'un conteneur en vue de faire la coupure, et il peut être difficile de déterminer le moment du retourYES
basée uniquement sur leUIScrollView
s'cadre.REMARQUE: Vous devriez aussi jeter un oeil à la Juri Pakaste de hitTest:withEvent: modification si vous rencontrez des problèmes avec la sous-vue de l'utilisateur.
UIScrollView
sous-classe pour le chargement paresseux de point de vue (danslayoutSubviews
), et utilisé unclippingRect
faire lapointInside:withEvent:
tests. Fonctionne vraiment bien, et pas de conteneur supplémentaire vue.UIScrollView
sous-classe comme @ohhorob mais avec un conteneur en vue pour le découpage et le retour[super pointInside:CGPointMake(self.contentOffset.x + self.frame.size.width/2, self.contentOffset.y + self.frame.size.height/2) withEvent:event];
danspointInside:withEvent:
. Cela fonctionne très bien et il n'y a pas de problèmes avec interaction de l'utilisateur mentionné dans @JuriPakaste de réponse.- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
ajouté à UIScrollViewDelegate dans iOS5 signifie que vous n'avez pas à passer par cette palabre plus.pagingEnabled
propriété de la scrollView àYES
, de mettre en œuvre cette méthode dans votredelegate
et définirtargetContentOffset
à ce décalage que vous voulez le défilement à "snap" pour...La
ClipView
solution ci-dessus a fonctionné pour moi, mais je devais faire un autre-[UIView hitTest:withEvent:]
mise en œuvre. Ed Marty version n'a pas obtenir de l'interaction de l'utilisateur vertical scrollviews j'ai à l'intérieur de l'horizontale.La version suivante a fonctionné pour moi:
Définir la taille d'image de la scrollView que vos pages taille serait:
Maintenant, vous pouvez effectuer un panoramique sur
self.view
, et le contenu sur le scrollView seront décalés.Également utiliser
scrollView.clipsToBounds = NO;
pour éviter l'écrêtage du contenu.J'ai fini par aller avec la coutume UIScrollView moi-même que c'était la plus rapide et la plus simple méthode, me semblait-il. Cependant, je ne vois pas de code exact donc pensé que je voudrais partager. Mes besoins pour un UIScrollView qui avait peu de contenu et, par conséquent, la UIScrollView elle-même était petite pour atteindre la pagination de l'affect. Comme le post-unis, vous ne pouvez pas balayer. Mais maintenant, vous le pouvez.
Créer une classe CustomScrollView et la sous-classe UIScrollView. Ensuite, tout ce que vous devez faire est d'ajouter ceci dans le .m fichier:
Cette touche permet de faire défiler de gauche à droite (horizontale). Ajuster les limites en conséquence à définir votre glisser/défilement de la zone tactile. Profitez-en!
J'ai fait une autre mise en oeuvre, qui peut retourner la scrollview automatiquement. Donc, il n'a pas besoin d'avoir un IBOutlet, ce qui limite reusage dans le projet.
J'ai un autre potentiellement utiles à la modification de la ClipView hitTest mise en œuvre. Je n'aimais pas avoir à fournir un UIScrollView référence à la ClipView. Mon de mise en œuvre ci-dessous vous permet de ré-utiliser le ClipView classe pour développer la hit-zone de test de quoi que ce soit, et ne pas avoir à fournir une référence.
J'ai mis en place le upvoted suggestion ci-dessus, mais le
UICollectionView
je l'aide a été considéré comme tout ce qui sort du cadre de l'écran. Cela a causé des cellules voisines à seulement rendre en dehors des limites lorsque l'utilisateur a été défilement vers eux, ce qui n'était pas l'idéal.Ce que j'ai fait était en émulant le comportement d'un scrollview en ajoutant la méthode ci-dessous pour les délégué (ou
UICollectionViewLayout
).Cela évite la délégation de l'action de balayage entièrement, ce qui était aussi un bonus. Le
UIScrollViewDelegate
a une méthode similaire appeléscrollViewWillEndDragging:withVelocity:targetContentOffset:
qui pourrait être utilisé à la page UITableViews et UIScrollViews.Permettre de cuisson appuyez sur les événements de l'enfant vues sur le défilement de la vue tout en soutenant la technique de cette question. Utilise une référence pour le défilement de l'affichage (auto.le scrollView) pour des raisons de lisibilité.
Ajouter à votre enfant de voir pour capturer l'événement tactile:
(C'est une variation sur user1856273 de la solution. Nettoyés pour des raisons de lisibilité et incorporé Bartserk de correction de bug. J'ai pensé de l'édition user1856273 de la réponse, mais il était trop grand changement à faire.)
ma version
En appuyant sur le bouton allongé sur le défilement de travail =)
mais seulement [[auto des sous-vues] objectAtIndex: 0] doit être un défilement