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
        }
    }
}

(Просмотр коллекции, вид таблицы, все то же самое.)

Другие вопросы по тегам