【问题标题】:How to pin a UIView underneath the iOS 11 NavigationBar's changing height frame?如何在 iOS 11 NavigationBar 的更改高度框架下固定 UIView?
【发布时间】:2018-07-20 22:44:06
【问题描述】:

我有一个导航栏和一个集合视图以编程方式添加到我的应用程序中,我也在尝试添加一个自定义视图。我已经让视图位于集合视图上方和导航栏下方,这是我想要的,但是,在 iOS 11 上,导航栏的高度会根据您是否向下拉伸集合视图而变化。我想让视图也向下移动,这样集合视图和导航栏之间就没有空白空间,因为我的自定义视图不会进一步向下移动,因为视图的 safeInsets 不会改变。它将向上移动到折叠的标题,这不是问题。

override func viewDidLoad() {
    super.viewDidLoad()

    navigationItem.title = "Home"

    navigationController?.navigationBar.prefersLargeTitles = true

    collectionView?.backgroundColor = UIColor.white
    collectionView?.translatesAutoresizingMaskIntoConstraints = false
    //collectionView?.contentInset = UIEdgeInsets(top: 50, left: 0, bottom: 0, right: 0)
    //collectionView?.scrollIndicatorInsets = UIEdgeInsets(top: 50, left: 0, bottom: 0, right: 0)

    collectionView?.register(StockCell.self, forCellWithReuseIdentifier: "cellid")

    setupMenuBar()
}

let menuBar: MenuBar = {
    let mb = MenuBar()
    mb.translatesAutoresizingMaskIntoConstraints = false
    mb.backgroundColor = .black
    return mb
}()

private func setupMenuBar() {
    view.addSubview(menuBar)
    NSLayoutConstraint.activate([
        (collectionView?.topAnchor.constraint(equalTo: menuBar.bottomAnchor))!,
        (collectionView?.widthAnchor.constraint(equalTo: view.widthAnchor))!,
        (collectionView?.bottomAnchor.constraint(equalTo: view.bottomAnchor))!,
        menuBar.heightAnchor.constraint(equalToConstant: 50),
        menuBar.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1),
        menuBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
    ])

}

This is the starting screen, showing the view in its resting position

This is the navigation bar overlapping the view, which is what I want to fix

【问题讨论】:

    标签: ios iphone swift ios11 mobile-development


    【解决方案1】:

    您可以将自定义菜单视图的底部锚点约束到导航栏的底部锚点;这样,菜单视图将始终保持相同的垂直偏移(尽管您可能必须熟悉其他一些约束):

    navigationController!.navigationBar.bottomAnchor.constraint(equalTo: menuBar.bottomAnchor)
    

    有关扩展示例,请参阅 this answer

    【讨论】:

      【解决方案2】:

      我找到了一种解决方法,无需在导航栏和菜单栏之间使用约束,因为它们不在同一个视图层次结构中。

      override func scrollViewDidScroll(_ scrollView: UIScrollView) {
          if (scrollView.contentOffset.y < -50) {
              let val = (-50 - scrollView.contentOffset.y)
              menuBar.frame.origin.y = val - 0.5
          }
      }
      

      通过覆盖此函数,菜单栏将向下移动其 y 偏移量,并在向下滚动集合视图时将固定功能保留在顶部。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-14
        • 2014-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多