13 ответов:
обновление для iOS 7
[self.scrollView setContentOffset: CGPointMake(0, -self.scrollView.contentInset.top) animated:YES];оригинал
[self.scrollView setContentOffset:CGPointZero animated:YES];или если вы хотите сохранить горизонтальное положение прокрутки и просто сбросить вертикальное положение:
[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, 0) animated:YES];
вот быстрое расширение, которое делает его легким:
extension UIScrollView { func scrollToTop() { let desiredOffset = CGPoint(x: 0, y: -contentInset.top) setContentOffset(desiredOffset, animated: true) } }использование:
myScrollView.scrollToTop()
iOS 11 и выше
попробуйте работать с новым
adjustedContentInset.например (прокрутите вверх):
var offset = CGPoint( x: -scrollView.contentInset.left, y: -scrollView.contentInset.top) if #available(iOS 11.0, *) { offset = CGPoint( x: -scrollView.adjustedContentInset.left, y: -scrollView.adjustedContentInset.top) } scrollView.setContentOffset(offset, animated: true)даже если вы используете
prefersLargeTitles,safe areaetc.
ответ для Swift 2.0/3.0/4.0 и iOS 7+:
let desiredOffset = CGPoint(x: 0, y: -self.scrollView.contentInset.top) self.scrollView.setContentOffset(desiredOffset, animated: true)
в iOS7 у меня были проблемы с получением конкретного scrollview, чтобы перейти к вершине, которая работала в iOS6, и использовал это, чтобы установить scrollview, чтобы перейти к вершине.
[self.myScroller scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];
Swift 3.0.1 версия ответ Роба майоффа:
self.scrollView.setContentOffset( CGPoint(x: 0,y: -self.scrollView.contentInset.top), animated: true)
чтобы полностью воспроизвести поведение scrollToTop в строке состояния, мы не только должны установить contentOffset, но также хотим убедиться, что отображаются scrollIndicators. В противном случае пользователь может быстро потеряться.
единственный публичный метод для достижения этой цели
flashScrollIndicators. К сожалению, назвав его один раз после установки contentOffset не имеет никакого эффекта, потому что он немедленно сбросить. Я обнаружил, что это работает при выполнении вспышки каждый раз в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 в строке состояния, но все равно выглядит неплохо.
обратите внимание, что я злоупотребляю тегом view для передачи состояния "isScrollingToTop", потому что мне это нужно для контроллеров вида. Если вы используете теги для чего-то еще, вы можете заменить это на iVar или свойство.
прокрутите вверх для
UITableViewController,UICollectionViewControllerиUIViewControllerСUIScrollViewextension 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) } } } } }
Я думаю, что у меня есть ответ, который должен быть полностью совместим с iOS 11, а также с предыдущими версиями (для вертикальной прокрутки)
это учитывает новый adjustedContentInset а также учитывает дополнительное смещение, необходимое при prefersLargeTitles включен на навигационной панели, которая, как представляется, требует дополнительного смещения 52px поверх любого значения по умолчанию
Это было немного сложно, потому что adjustedContentInset изменения в зависимости от состояния заголовка (большой заголовок против малого заголовка), поэтому мне нужно было проверить и посмотреть, какова высота заголовка, и не применять смещение 52px, если оно уже находится в большом состоянии. Не удалось найти никакого другого метода для проверки состояния навигационной панели, поэтому, если у кого-то есть лучший вариант, чем видеть, если высота > 44.0, я хотел бы услышать это
func scrollToTop(_ scrollView: UIScrollView, animated: Bool = true) { if #available(iOS 11.0, *) { let expandedBar = (navigationController?.navigationBar.frame.height ?? 64.0 > 44.0) let largeTitles = (navigationController?.navigationBar.prefersLargeTitles) ?? false let offset: CGFloat = (largeTitles && !expandedBar) ? 52: 0 scrollView.setContentOffset(CGPoint(x: 0, y: -(scrollView.adjustedContentInset.top + offset)), animated: animated) } else { scrollView.setContentOffset(CGPoint(x: 0, y: -scrollView.contentInset.top), animated: animated) } }вдохновленный решением Якуба
очень часто, когда ваша панель навигации перекрывается небольшая часть содержимого scrollView и похоже, что содержимое начинается не сверху. Для его исправления я сделал 2 вещи:
- Инспектор Размера-Вид Прокрутки - вставки содержимого -- > изменить с автоматического На никогда.
- инспектор размеров-ограничения - "выровнять сверху до" (ограничения верхнего выравнивания) - второй элемент --> изменить из Суперпанель.Сверху в безопасную зону.Топ и значение(постоянное поле) значение 0
Я перепробовал все способы. Но у меня ничего не получалось. Наконец - то мне это понравилось.
добавил
self.view .addSubview(self.scroll)строка кода в viewDidLoad. После начала настройки рамки для просмотра прокрутки и добавлены компоненты для просмотра прокрутки.это сработало для меня.
убедитесь, что вы добавили
self.view .addSubview(self.scroll)строка в начале. затем вы можете добавить элементы пользовательского интерфейса.


Comments