質問は簡単です。スクロールビューが下にスクロールしたときに大きなタイトルのナビゲーションバーが折りたたまれるのを防ぐにはどうすればよいですか?
私のナビゲーションには常に大きなナビゲーションバーが必要です...スクロールビュースクロール時にナビゲーションバーが折りたたまれないようにし、同じサイズのままにする必要があります。どうすればよいですか?
これが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])
}
私が考え出した回避策は、CollectionView/TableView
ベースビューの最初のビューとしてViewController's
ではないプレースホルダービューを追加することです。この最初のビューはsafeAreaの上部に添付され、高さはゼロにすることができます。
ストーリーボード/ Xibの使用:
制約のあるこのビューについては、以下のスクリーンショットを参照してください
次に、別のUIView
を追加して、TableView/CollectionView
のコンテナビューとして機能させます。このコンテナの上部は、プレースホルダービューの下部にアタッチされます。コンテナビューとTableView/CollectionView
の制約については、以下のスクリーンショットを参照してください。
ここで重要なのは、ビュー階層の最初のビューです。navigation bar
がそれをチェックして、折りたたみ効果を設定します。 CollectionView/TableView
として検出されない場合、スクロールしても折りたたまれません。
プログラムで:
プログラムでビューを設定する場合は、上部にプレースホルダービューを追加するだけです。
例えば、
self.view.addSubview(UIView(frame: .zero))
self.view.addSubview(tableView) // or collectionView
誰かが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)
}
}
大きなタイルのナビゲーションバーが崩壊するのを防ぐには、viewDidLoadメソッドのUIViewControllerに2番目のビューを追加するだけです。
view.addSubview(UIView())
何らかの理由で、これによりUIScrollViewとナビゲーションバーの間のリンクが切断されます。