А UIScrollViewс включенным разбиением по страницам остановится на кратной ширине (или высоте) его кадра. Итак, первый шаг - выяснить, какой ширины вы хотите, чтобы ваши страницы были. Сделайте так, чтобы ширина UIScrollView. Затем установите размеры вашего subview, какими бы большими они вам ни были, и установите их центры на основе кратной 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кадре.
ПРИМЕЧАНИЕ. Вам также следует взглянуть на модификацию Juri Pakaste hitTest: withEvent:, если у вас возникли проблемы с взаимодействием с пользователем в подпредставлении.