A UIScrollView
с включенной подкачкой остановится на кратных ширине (или высоте) кадра. Итак, первый шаг - выяснить, насколько широкими должны быть ваши страницы. Сделайте это шириной UIScrollView
. Затем установите размеры вашего подпредставления, какими бы большими они вам ни были нужны, и установите их центры на основе кратных ширине UIScrollView
.
Тогда, поскольку вы хотите видеть другие страницы, конечно, установите clipsToBounds
в NO
, как указано в mhjoy. Теперь уловка состоит в том, чтобы прокрутить его, когда пользователь начинает перетаскивание за пределы диапазона кадра UIScrollView
. Мое решение (когда я должен был сделать это совсем недавно) было следующим:
Создайте UIView
подкласс (то есть ClipView
), который будет содержать UIScrollView
и его подпредставления. По сути, он должен иметь структуру того, что, как вы предполагаете, UIScrollView
будет иметь при нормальных обстоятельствах. Поместите UIScrollView
в центр ClipView
. Убедитесь, что ClipView
s clipsToBounds
установлен на YES
, если его ширина меньше ширины родительского представления. Кроме того, ClipView
требуется ссылка на UIScrollView
.
Последний шаг - переопределить - (UIView *)hitTest:withEvent:
внутри ClipView
.
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
return [self pointInside:point withEvent:event] ? scrollView : nil;
}
Это в основном расширяет область касания UIScrollView
до рамки вида его родителя, именно то, что вам нужно.
Другим вариантом может быть создание подкласса UIScrollView
и переопределение его метода - (BOOL)pointInside:(CGPoint) point withEvent:(UIEvent *) event
, однако вам все равно потребуется представление контейнера для выполнения отсечения, и может быть трудно определить, когда возвращать YES
, основываясь только на UIScrollView
кадр.
ПРИМЕЧАНИЕ: Вам также следует взглянуть на hitTest: withEvent: модификация Джури Пакасте, если у вас есть проблемы с взаимодействием с пользователем subview.