Ограничение прокручиваемой области в UIScrollView - PullRequest
7 голосов
/ 20 октября 2010

У меня есть UIScrollView, который прокручивает довольно большой UIView.

В определенные моменты времени я хочу ограничить область, в которой пользователь может прокручивать. Например, я могу только разрешить им просматривать нижнюю четверть представления.

Я могуограничить область путем переопределения scrollViewDidScroll и последующего вызова setContentOffset, если представление прокручивалось слишком далеко.Но таким образом, я не могу заставить его отскочить назад так гладко, как это делает UIScrollView, естественно, при прокрутке за пределы UIView.

Есть ли лучший способ ограничить область прокрутки в UIScrollView?*

Ответы [ 4 ]

17 голосов
/ 20 октября 2010

Я бы изменил свойство contentSize представления прокрутки на размер области, в которой пользователь должен иметь возможность прокручивать и настраивать frame.origin подпредставления так, чтобы верхняя левая граница, которую вы хотите видеть, появляется в (0, 0) относительно представления прокрутки.Например, если ваш вид имеет высоту 800 точек и вы хотите показать нижнюю четверть, установите для параметра contentSize высоту 200 и для компонента y view.frame.origin установите значение -600.

5 голосов
/ 29 июля 2014

Я нашел то, что работает для меня.Это позволит вам прокрутить до точки 0,0, но не дальше:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView.contentOffset.x <= -1) {
        [scrollView setScrollEnabled:NO];
        [self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
        [scrollView setScrollEnabled:YES];
    }
}

Вы можете сделать то же самое для верхней, нижней или правой (х или у)

0 голосов
/ 09 сентября 2018

небольшое улучшение ответа Йоко в Swift 4 будет

override func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.y > 600 {
        let anim = UIViewPropertyAnimator(duration: 1, dampingRatio: 0.5) {
            scrollView.isScrollEnabled = false
            scrollView.setContentOffset(CGPoint(x: 0, y: 600), animated: false)
            scrollView.isScrollEnabled = true
        }
        anim.startAnimation()
    }
}

, что сделает анимацию прокрутки действительно похожей на то, что она должна делать. Более медленное перетаскивание, когда вы находитесь в области «отскока», не будет работать, и длительность анимации должна зависеть от расстояния (не такого как здесь), если вы хотите быть точным. Вы также можете попробовать сделать эту логику в scrollViewDidScroll и посмотреть, как она отличается. Ключевым моментом является то, что setContentOffset(_:,animated:) должно быть с animated: false , чтобы блок UIViewPropertyAnimator мог захватить его и анимировать

0 голосов
/ 14 ноября 2016

Другой подход заключается в переопределении метода UIScrollView:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event.

Возвращение YES позволит пользователю прокручивать. Возвращать NO не буду.

ПРИМЕЧАНИЕ: Это отключит все касания для любых видов, встроенных в UIScrollView, которым pointInside возвращает NO. Полезно, если область, из которой вы не хотите прокручивать, не взаимодействует.


Этот пример позволяет UIScrollView прокручивать, только когда пользователь прокручивает на UITableView. (A UITableView и два UIViews встроены в UIScrollView)

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    for (UIView *subview in self.subviews) {
        if ([subview pointInside:[self convertPoint:point toView:subview] withEvent:event] && ![subview isKindOfClass:[UITableView class]]) {
            return NO;
        }
    }
    return YES;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...