示例项目可在https://github.com/SRowley90/LargeTitleIssueTestiOS
中找到我正在尝试将分段控件放在iOS应用中大标题下方。我有一个UIToolbar,其中包含分段控件。
向上滚动title
和toolbar
时的行为符合预期。
向下滚动导航条是正确的,但是不会向下滑动UITabBar或UITableView,这意味着标题位于分段控件的上方,如下面的图片所示。
我很确定这与我设置的约束有关,但是我不知道是什么。
我已经设置了位置UITabBarDelegate方法:
func position(for bar: UIBarPositioning) -> UIBarPosition {
return .topAttached
}
答案 0 :(得分:0)
将tableView
的委派到某处:
tableView.delegate = self
覆盖scrollViewDidScroll
并更新toolbar
的位置外观(因为真实位置不应根据具有那样好的反弹效果而改变。
extension ViewController: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let verticalOffset = scrollView.contentOffset.y
if verticalOffset >= 0 {
toolbar.transform = .identity
} else {
toolbar.transform = CGAffineTransform(translationX: 0, y: -verticalOffset)
}
}
}
您可以在应用转换之前使用以下检查,以使其对默认的iOS样式更加可靠和自然:
if #available(iOS 11.0, *) {
guard let navigationController = navigationController else { return }
guard navigationController.navigationBar.prefersLargeTitles else { return }
guard navigationController.navigationItem.largeTitleDisplayMode != .never else { return }
}
答案 1 :(得分:0)
对我来说,使用UIScrollViewDelegate
在CollectionView和工具栏上不能很好地工作。所以,我做到了:
final class CollectionViewController: UICollectionViewController {
private var observesBag: [NSKeyValueObservation] = []
private let toolbar = UIToolbar()
override func viewDidLoad() {
super.viewDidLoad()
let statusBarHeight = UIApplication.shared.statusBarFrame.height
let navigationBarHeight = navigationController?.navigationBar.frame.height ?? 0
let defaultNavigationBarHeight = statusBarHeight + navigationBarHeight
let observation = navigationController!
.navigationBar
.observe(\.center, options: NSKeyValueObservingOptions.new) { [weak self] navBar, _ in
guard let self = self else { return }
let newNavigatonBarHeight = navBar.frame.height + statusBarHeight
let yTranslantion = newNavigatonBarHeight - defaultNavigationBarHeight
if yTranslantion > 0 {
self.toolbar.transform = CGAffineTransform(
translationX: 0,
y: yTranslantion
)
} else {
self.toolbar.transform = .identity
}
}
observesBag.append(observation)
}
}
观察navigationBar
的“中心”进行更改,然后在y轴上平移toolbar
。
即使当我尝试将此解决方案与UIRefreshControl
和大标题一起使用时,它也能很好地工作,但效果并不理想。
我将刷新控件设置为:
private func setupRefreshControl() {
let refreshControl = UIRefreshControl()
self.webView.scrollView.refreshControl = refreshControl
}
UINavigationBar
的高度在完全刷新触发器之后更改。