A UIScrollView
mit aktiviertem Paging stoppt bei einem Vielfachen seiner Rahmenbreite (oder -höhe). Der erste Schritt besteht also darin, herauszufinden, wie breit Ihre Seiten sein sollen. Machen Sie das die Breite der UIScrollView
. Stellen Sie dann die Größe Ihrer Unteransicht so groß ein, wie Sie sie benötigen, und legen Sie ihre Zentren basierend auf Vielfachen der UIScrollView
Breite der Unteransicht fest .
Dann, da Sie die anderen Seiten sehen möchten, stellen Sie natürlich ein clipsToBounds
, NO
wie mhjoy angegeben hat. Der Trick besteht nun darin, einen Bildlauf durchzuführen, wenn der Benutzer das Ziehen außerhalb des Bereichs des UIScrollView
Rahmens startet . Meine Lösung (als ich dies kürzlich tun musste) war wie folgt:
Erstellen Sie eine UIView
Unterklasse (dh ClipView
), die die UIScrollView
und ihre Unteransichten enthält. Im Wesentlichen sollte es den Rahmen haben, den Sie UIScrollView
unter normalen Umständen annehmen würden. Platzieren Sie das UIScrollView
in der Mitte des ClipView
. Stellen Sie sicher, dass das ClipView
's auf clipsToBounds
gesetzt ist, YES
wenn seine Breite kleiner als die der übergeordneten Ansicht ist. Auch das ClipView
braucht einen Verweis auf die UIScrollView
.
Der letzte Schritt ist das Überschreiben - (UIView *)hitTest:withEvent:
innerhalb der ClipView
.
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
return [self pointInside:point withEvent:event] ? scrollView : nil;
}
Dies erweitert im Grunde den Berührungsbereich von UIScrollView
auf den Rahmen der Ansicht seiner Eltern, genau das, was Sie brauchen.
Eine andere Möglichkeit wäre, UIScrollView
die - (BOOL)pointInside:(CGPoint) point withEvent:(UIEvent *) event
Methode zu unterklassifizieren und zu überschreiben. Sie benötigen jedoch weiterhin eine Containeransicht, um das Abschneiden durchzuführen, und es kann schwierig sein, anhand YES
des UIScrollView
Frames des Frames zu bestimmen, wann zurückgegeben werden soll.
HINWEIS: Sie sollten sich auch Juri Pakaste's hitTest: withEvent: Modifikation ansehen, wenn Sie Probleme mit der Benutzerinteraktion in der Unteransicht haben.