繁体   English   中英

如何将UIView固定在iOS 11 NavigationBar不断变化的高度框架下?

[英]How to pin a UIView underneath the iOS 11 NavigationBar's changing height frame?

我有一个导航栏和一个以编程方式添加到我的应用程序中的集合视图,我也试图添加自定义视图。 我已经将视图放置在集合视图上方和导航栏下面,这就是我想要的,但是,在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)
    ])

}

这是开始屏幕,显示处于静止位置的视图

这是与视图重叠的导航栏,这是我要修复的问题

您可以将自定义菜单视图的底部锚点约束到导航栏的底部锚点; 这样,菜单视图将始终保持相同的垂直偏移量(不过,您可能不得不适应一些其他约束):

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

有关扩展示例,请参见此答案

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM