А 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:, если у вас возникли проблемы с взаимодействием с пользователем в подпредставлении.