iOS развивается. Как расширить область ответа на событие прокрутки UIScrollView?
У меня есть UIScrollView
Пейджинг включен и настроен clipToBounds = NO
так что я могу видеть за пределами текущей страницы.
Я хочу, чтобы пользователь мог прокручивать UIScrollView
на всей видимой области, а не только на части текущей страницы.
Как я могу это реализовать?
Благодарю.
PS Согласно документации Apple (http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIScrollView_Class/Reference/UIScrollView.html), если значение pagingEnabled
свойство YES
представление прокрутки останавливается на кратных границах представления прокрутки, когда пользователь выполняет прокрутку.
Это означает, что я не могу просто изменить размер UIScrollView
чтобы получить то, что я хочу, без ущерба для функциональности подкачки, не так ли?
2 ответа
Поместите скроллвью в uiview и отключите clipsToBounds
из прокрутки. Размер прокрутки должен соответствовать размеру страницы. вы увидите контент за пределами просмотра прокрутки, но постраничный просмотр останется прежним. Вы можете активировать clipsToBounce
для внешнего вида, чтобы ограничить размер прокрутки.
Перезаписать hitTest
вида, чтобы перенаправить прикосновения к просмотру прокрутки... тогда вы также сможете прокручивать, касаясь за пределами просмотра прокрутки.
Почему бы вам не изменить размер scrollView, чтобы он соответствовал нужной вам области?
Не уверен, что это поможет, но попробуйте переопределить UIScrollView pointInside
метод
- (BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event {
CGRect newBounds = self.bounds;
newBounds = CGRectInset(bounds, 0, -100.0f);
return CGRectContainsPoint(newBounds, point);
}
Пример синтаксиса 2019:
class LargerScrollArea: UICollectionView {
// Example, say this is the left half of the screen, but, we wish to be
// able to scroll on the whole width of the screen
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if isUserInteractionEnabled == false { return nil }
let extraOnRight = bounds.width
let largerBounds = bounds.inset(by:
UIEdgeInsets(top: 0, left: 0, bottom:0, right: -extraOnRight))
if largerBounds.contains(point) {
return self
}
else {
return nil
}
}
}
(Просмотр коллекции, вид таблицы, все то же самое.)