Мне кажется, у меня есть ответ, который должен быть полностью совместим с iOS 11, а также с предыдущими версиями (для вертикальной прокрутки)
Это учитывает новый СкорректированныйContentInset , а также учитывает дополнительное смещение, требуемое, когда prefersLargeTitles включено на навигационной панели, которая, по-видимому, требует дополнительного 52-пиксельного смещения поверх любого значения. по умолчанию
Это было немного сложно, потому чтоsetContentInset изменяется в зависимости от состояния titleBar (большой заголовок против маленького заголовка), поэтому мне нужно было проверить и посмотреть, какова была высота titleBar, и не применять смещение 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)
}
}
Вдохновленный решением Якуба