Получить UIScrollView для перехода к началу страницы

Как настроить прокрутку UIScrollView вверху?

4b9b3361

ОБНОВЛЕНИЕ ДЛЯ iOS 7

[self.scrollView setContentOffset:
    CGPointMake(0, -self.scrollView.contentInset.top) animated:YES];

ORIGINAL

[self.scrollView setContentOffset:CGPointZero animated:YES];

или если вы хотите сохранить положение горизонтальной прокрутки и просто reset вертикальное положение:

[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, 0)
    animated:YES];
274
ответ дан 26 февр. '12 в 6:40
источник

Ниже приведено расширение Swift 2 и 3:

extension UIScrollView {
    func scrollToTop() {
        let desiredOffset = CGPoint(x: 0, y: -contentInset.top)
        setContentOffset(desiredOffset, animated: true)
   }
}

Использование:

myScrollView.scrollToTop()
33
ответ дан 01 февр. '16 в 3:37
источник

Ответ для Swift 2.0 и iOS 7 +:

let desiredOffset = CGPoint(x: 0, y: -self.scrollView.contentInset.top)
self.scrollView.setContentOffset(desiredOffset, animated: true)

Обновление 10/6/16: похоже, что это все еще действует в Swift 3.0 ????

11
ответ дан 09 янв. '16 в 1:27
источник

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

[self.myScroller scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];
7
ответ дан 23 сент. '13 в 1:11
источник

Для iOS 11 и выше - работайте с новым adjustedContentInset

Например:

if #available(iOS 11.0, *) {
    let offset = CGPoint(x: -scrollView.adjustedContentInset.left, y: -scrollView.adjustedContentInset.top)
    scrollView.setContentOffset(offset, animated: true)

} else {
    let offset = CGPoint(x: -scrollView.contentInset.left, y: -scrollView.contentInset.top)
    scrollView.setContentOffset(offset, animated: true)
}

Даже если вы используете prefersLargeTitles, Safe Area и т.д.

6
ответ дан 07 окт. '17 в 2:35
источник

Чтобы полностью воспроизвести поведение прокрутки в строке состояния, мы не только должны установить contentOffset, но также хотим убедиться, что отображаются символы scrollIndicators. В противном случае пользователь может быстро потеряться.

Единственный публичный метод для этого - flashScrollIndicators. К сожалению, вызов один раз после установки contentOffset не влияет, потому что он reset немедленно. Я нашел, что это работает при выполнении вспышки каждый раз в scrollViewDidScroll:.

// define arbitrary tag number in a global constants or in the .pch file
#define SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG 19291

- (void)scrollContentToTop {
    [self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.scrollView.contentInset.top) animated:YES];

    self.scrollView.tag = SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        self.scrollView.tag = 0;
    });
}

В UIScrollViewDelegate (или UITable/UICollectionViewDelegate) реализовано следующее:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.tag == SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG) {
        [scrollView flashScrollIndicators];
    }
}

Задержка скрыть немного короче по сравнению с поведением scrollToTop в строке состояния, но она по-прежнему выглядит красиво.

Обратите внимание, что я злоупотребляю тегом представления, чтобы передать состояние "isScrollingToTop", потому что мне нужно это через контроллеры представлений. Если вы используете теги для чего-то еще, вы можете заменить это на iVar или свойство.

1
ответ дан 20 мая '14 в 21:36
источник

Прокрутите вверх для UITableViewController, UICollectionViewController или любого UIViewController, имеющего UIScrollView

extension UIViewController {

  func scrollToTop(animated: Bool) {
    if let tv = self as? UITableViewController {
        tv.tableView.setContentOffset(CGPoint.zero, animated: animated)
    } else if let cv = self as? UICollectionViewController{
        cv.collectionView?.setContentOffset(CGPoint.zero, animated: animated)
    } else {
        for v in view.subviews {
            if let sv = v as? UIScrollView {
                sv.setContentOffset(CGPoint.zero, animated: animated)
            }
        }
    }
  }
}
0
ответ дан 06 окт. '17 в 15:03
источник

Я пробовал все. Но для меня ничего не работало. Наконец мне это понравилось.

Я добавил строку кода self.view .addSubview(self.scroll) в viewDidLoad. После начала настройки рамки для просмотра прокрутки и добавления компонентов для просмотра прокрутки.

Это сработало для меня.

Убедитесь, что вы добавили строку self.view .addSubview(self.scroll) в начале. то вы можете добавить элементы пользовательского интерфейса.

-4
ответ дан 11 марта '16 в 11:03
источник