Как настроить прокрутку UIScrollView вверху?
Получить UIScrollView для перехода к началу страницы
Ответ 1
ОБНОВЛЕНИЕ ДЛЯ 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];
Ответ 2
Ниже приведено расширение Swift 2 и 3:
extension UIScrollView {
func scrollToTop() {
let desiredOffset = CGPoint(x: 0, y: -contentInset.top)
setContentOffset(desiredOffset, animated: true)
}
}
Использование:
myScrollView.scrollToTop()
Ответ 3
Используйте setContentOffset:animated:
[scrollView setContentOffset:CGPointZero animated:YES];
Ответ 4
Ответ для 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 👍
Ответ 5
В iOS7 у меня возникли проблемы с получением определенного прокрутки, чтобы перейти на верх, который работал в iOS6, и использовал это, чтобы установить прокрутку в верхнюю часть.
[self.myScroller scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];
Ответ 6
Для 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
и т.д.
Ответ 7
Swift 3.0.1 версия rob mayoff answer:
self.scrollView.setContentOffset(
CGPoint(x: 0,y: -self.scrollView.contentInset.top),
animated: true)
Ответ 8
Чтобы полностью воспроизвести поведение прокрутки в строке состояния, мы не только должны установить 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 или свойство.
Ответ 9
Прокрутите вверх для 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)
}
}
}
}
}
Ответ 10
Я пробовал все. Но для меня ничего не работало. Наконец мне это понравилось.
Я добавил строку кода self.view .addSubview(self.scroll)
в viewDidLoad. После начала настройки рамки для просмотра прокрутки и добавления компонентов для просмотра прокрутки.
Это сработало для меня.
Убедитесь, что вы добавили строку self.view .addSubview(self.scroll)
в начале. то вы можете добавить элементы пользовательского интерфейса.