web-dev-qa-db-ja.com

大きなタイトルが崩壊するのを防ぐ方法

質問は簡単です。スクロールビューが下にスクロールしたときに大きなタイトルのナビゲーションバーが折りたたまれるのを防ぐにはどうすればよいですか?

私のナビゲーションには常に大きなナビゲーションバーが必要です...スクロールビュースクロール時にナビゲーションバーが折りたたまれないようにし、同じサイズのままにする必要があります。どうすればよいですか?

これが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の使用:

制約のあるこのビューについては、以下のスクリーンショットを参照してください

enter image description here

次に、別のUIViewを追加して、TableView/CollectionViewのコンテナビューとして機能させます。このコンテナの上部は、プレースホルダービューの下部にアタッチされます。コンテナビューとTableView/CollectionViewの制約については、以下のスクリーンショットを参照してください。

enter image description here

ここで重要なのは、ビュー階層の最初のビューです。navigation barがそれをチェックして、折りたたみ効果を設定します。 CollectionView/TableViewとして検出されない場合、スクロールしても折りたたまれません。

プログラムで:

プログラムでビューを設定する場合は、上部にプレースホルダービューを追加するだけです。

例えば、

self.view.addSubview(UIView(frame: .zero))
self.view.addSubview(tableView) // or collectionView
7
Kamran

誰かが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)
    }
}

1
DogCoffee

大きなタイルのナビゲーションバーが崩壊するのを防ぐには、viewDidLoadメソッドのUIViewControllerに2番目のビューを追加するだけです。

view.addSubview(UIView())

何らかの理由で、これによりUIScrollViewとナビゲーションバーの間のリンクが切断されます。

0
aepryus