我想滚动到tableView的顶部,并在我点击选项卡栏上的选项卡时,也显示largeTitle
中的navigationBar
。
使用scrollToRow
方法不显示largeTitle:
extension TableViewConstroller: UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
if tabBarController.selectedIndex == 1 {
let indexPath = IndexPath(row: 0, section: 0)
tableView.scrollToRow(at: indexPath, at: .top, animated: true)
}
}
}
我也尝试过
self.tableView.scrollRectToVisible(CGRect(x: 0, y: -64, width: 1, height: 1), animated: true)
这有时可行,但是如果我向下滚动tableView
,则向上滚动此方法时navigationBar
仍会折叠。
我该如何模仿tableView的scrollsToTop
属性的行为,该属性会滚动到顶部并显示largeTitle
?它动画非常流畅,并且始终显示较大的navigationBar
。
我在UITabBarControllerDelegate
中使用了这两种方法:第二种方法搜索第一个scrollView
,然后滚动到该scrollView
的顶部。并且由于tableView
也是scrollView
,因此此方法有效。
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
if tabBarController.selectedViewController == viewController {
if let scrollView = findScrollView(in: viewController.view) {
let desiredOffset = CGPoint(x: 0, y: -scrollView.contentInset.top - 96 + UIApplication.shared.statusBarFrame.height)
scrollView.setContentOffset(desiredOffset, animated: true)
}
}
return true
}
private func findScrollView(in view: UIView) -> UIScrollView? {
if let scrollView = view as? UIScrollView {
return scrollView
} else {
for subview in view.subviews {
if let scrollView = findScrollView(in: subview) {
return scrollView
}
}
}
return nil
}