ios - 如何防止大标题折叠

标签 ios swift uinavigationcontroller uinavigationbar uinavigationitem

问题很简单,如何防止 ScrollView 向下滚动时大标题导航栏折叠?

我的导航栏必须始终有一个大导航栏...所以当 ScrollView 滚动时,导航栏不应折叠起来,它应该保持相同大小,我该怎么做?

这就是我设置 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 的占位符 View 作为ViewController 的 基本 View 中的第一个 View 。第一个 View 将附加到 safeArea 的顶部,高度可以为零。

使用 Storyboard/Xib:

请参阅下面的带有约束的 View 的屏幕截图

enter image description here

接下来添加另一个 UIView 作为您的 TableView/CollectionView 的容器 View 。此容器的顶部将附加到占位符 View 的底部。有关容器 View 和 TableView/CollectionView 的约束,请参见下面的屏幕截图。

enter image description here

此处的关键是 View 层次结构中的第一个 View ,因为导航栏 将检查它以设置折叠效果。一旦它没有找到它作为 CollectionView/TableView,它就不会在滚动时折叠。

以编程方式:

如果您以编程方式设置 View ,则只需在顶部添加一个占位符 View 。

例如,

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

关于ios - 如何防止大标题折叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50915191/

相关文章:

iphone - UI导航按钮更改

swift - 为什么我很快得到 'X is not convertible to T.Y'?

swift - 是否可以在 NSPopupButton 中对项目进行分组?

xcode - Swift、UICollectionView 和 UINavigationBar 上边距问题

ios - 在没有 segue 的情况下在多个 View Controller 之间共享数据(Swift 3)

ios - 嵌套的 UINavigationControllers 和 TabBarController

objective-c - 如何使用基类对象定义初始化器来填充基类属性?

ios - 如何在 iOS 8 中测试 http 请求?

ios - 创建自定义调出 View

ios - Swift ios 在数组中存储数据和字符串