A UIScrollView
z włączonym stronicowaniem zatrzyma się przy wielokrotnościach szerokości (lub wysokości) ramki. Więc pierwszym krokiem jest ustalenie, jak szerokie mają być Twoje strony. Spraw, aby szerokość UIScrollView
. Następnie ustaw rozmiary widoku podrzędnego, tak duże, jak potrzebujesz, i ustaw ich środki na podstawie wielokrotności UIScrollView
szerokości.
Następnie, ponieważ chcesz zobaczyć inne strony, oczywiście, zestaw clipsToBounds
do NO
jak mhjoy stwierdził. Sztuczka polega teraz na tym, że przewija się, gdy użytkownik rozpoczyna przeciąganie poza zakresem UIScrollView
ramki. Moje rozwiązanie (kiedy musiałem to zrobić bardzo niedawno) było następujące:
Utwórz UIView
podklasę (tj. ClipView
), UIScrollView
Która będzie zawierać podglądy i jej podziały. Zasadniczo powinien mieć ramy takie, jakie można by przypuszczać UIScrollView
w normalnych okolicznościach. Umieść UIScrollView
w środku ClipView
. Upewnij się, że wartość ClipView
's clipsToBounds
jest ustawiona na, YES
jeśli jej szerokość jest mniejsza niż szerokość widoku nadrzędnego. Ponadto ClipView
potrzeby odnoszą się do UIScrollView
.
Ostatnim krokiem jest zastąpienie - (UIView *)hitTest:withEvent:
wewnątrz pliku ClipView
.
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
return [self pointInside:point withEvent:event] ? scrollView : nil;
}
To w zasadzie rozszerza obszar dotykowy UIScrollView
do ramy widoku jego rodzica, dokładnie to, czego potrzebujesz.
Inną opcją byłoby utworzenie podklasy UIScrollView
i nadpisanie jej - (BOOL)pointInside:(CGPoint) point withEvent:(UIEvent *) event
metody, jednak nadal będziesz potrzebować widoku kontenera, aby wykonać obcinanie, a określenie, kiedy powrócić, może być trudne YES
tylko na podstawie UIScrollView
ramki.
UWAGA: Powinieneś także przyjrzeć się hitTest Juri Pakaste : withEvent: modyfikacja, jeśli masz problemy z interakcją użytkownika subview .