问题很简单,当滚动视图向下滚动时,如何防止大标题导航栏崩溃?
我的导航必须始终有一个大的导航栏...所以当滚动视图滚动时,导航栏不应该折叠,它应该保持相同的大小,我该怎么做?
这就是我设置largeTitle首选项的方法
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationItem.hidesBackButton = true
presenter.expandForSimulatorLayoutIfNeeded()
}
func expandForSimulatorLayoutIfNeeded(){
if !isExpanded{
topMenu = TopMenu(frame: expandedNavigationFrame, interactor: interactor)
oldNavigationBarFrame = navigationBar.frame
self.navigationBar.addSubview(topMenu)
}
if #available(iOS 11.0, *) {
self.navigationBar.prefersLargeTitles = true
} else {
self.navigationBar.frame = expandedNavigationFrame
}
let topConstraint = NSLayoutConstraint(item: topMenu, attribute: .top, relatedBy: .equal, toItem: navigationBar, attribute: .top, multiplier: 1, constant: 0)
let leadingConstraint = NSLayoutConstraint(item: topMenu, attribute: .leading, relatedBy: .equal, toItem: navigationBar, attribute: .leading, multiplier: 1, constant: 0)
let widthConstraint = NSLayoutConstraint(item: topMenu, attribute: .width, relatedBy: .equal, toItem: self.navigationBar, attribute: .width, multiplier: 1, constant: 0)
let bottomConstraint = NSLayoutConstraint(item: topMenu, attribute: .bottom, relatedBy: .equal, toItem: navigationBar, attribute: .bottom, multiplier: 1, constant: 0)
topMenu.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([leadingConstraint, widthConstraint, topConstraint, bottomConstraint])
}
答案 0 :(得分:4)
我想到的解决方法是添加一个不是CollectionView/TableView
的占位符视图作为ViewController's
基本视图中的第一个视图。第一个视图将附加到safeArea的顶部,高度可以为零。请参阅以下屏幕截图,了解包含约束的视图
接下来添加另一个UIView
作为TableView/CollectionView
的容器视图。此容器的顶部将附加到占位符视图的底部。请参阅以下屏幕截图,了解容器视图的约束和TableView/CollectionView
。
此处的关键是视图层次结构中的第一个视图,因为navigation bar
将检查设置折叠效果。一旦它找不到CollectionView/TableView
,它就不会在滚动时崩溃。
答案 1 :(得分:0)
要防止大图块导航栏崩溃,只需在viewDidLoad方法中向UIViewController添加第二个视图。
view.addSubview(UIView())
无论出于何种原因,这都会中断UIScrollView和导航栏之间的链接。
答案 2 :(得分:0)
如果有人从SwiftUI到达这里,这是将列表保持为大标题模式的好方法。
// your content view ...
var body: some View {
VStack {
PreventCollapseView()
List {
ForEach(things, id: \.self) { thing in
Text(thing.name)
}
}
}
.navigationBarTitle("All the things")
}
// end of view
struct PreventCollapseView: View {
private var mostlyClear = Color(UIColor(white: 0.0, alpha: 0.0005))
var body: some View {
Rectangle()
.fill(mostlyClear)
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 1)
}
}
答案 3 :(得分:0)
如果您在情节提要上创建了其他视图,则只需在 viewDidLoad
上调用以下方法。
private func preventLargeTitleCollapsing() {
let dummyView = UIView()
view.addSubview(dummyView)
view.sendSubviewToBack(dummyView)
}
我原来的答案是here。