热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ios11自定义导航栏位于状态栏下

如何解决《ios11自定义导航栏位于状态栏下》经验,为你挑选了2个好方法。

刚下载了xcode 9,我有这个奇怪的问题,在ios 11上,我的自定义导航栏看起来是一半大小并且在状态栏下,在ios 10上工作正常.

所以这是我的代码

let newNavbar: UINavigatiOnBar= UINavigationBar(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 64))
let navItem = UINavigationItem()

//create and assign the items

newNavbar.setItems([navItem], animated: false)
view.addSubview(newNavbar)

这是一个截图,左边是ios11,右边是ios10,

在此输入图像描述



1> matt..:

你的代码总是错的.您不应该自己设置手动添加的导航栏的高度,也不应将其放在视图的顶部.您应该将导航栏的顶部固定到状态栏的底部,并使用UIBarPositioningDelegate机制将其位置设置为.topAttached,这将使其在状态栏下正确拉伸.

(但您也应该问自己为什么要手动添加导航栏.通常没有理由不将视图控制器包装在UINavigationController中 - 即使您不打算进行任何实际导航 - 只是为了获取导航吧,所有的自动管理.)


您对superview的顶级空间约束为零.那不是我说的.事实上,这正是我所说的不做的事情.

2> Darren Cheng..:

请参阅ios 11自定义导航栏进入状态栏/ios 11导航栏重叠状态栏以获得答案

不确定这是否是同一个问题,但我们在升级到iOS 11时遇到了这个问题.

请参阅ios 11自定义导航栏进入状态栏

我们手动将导航栏高度设置为64并固定到超视图边缘.符合UINavigationBarDelegate协议并实现UIBarPositioningDelegate委托方法为我们解决了这个问题.

我们换了

navigationBar.autoPinEdgesToSuperviewEdgesExcludingEdge(.bottom)
navigationBar.autoSetDimension(.height, toSize: 64)

...
  if #available(iOS 11.0, *) {
    navigationBar.topAnchor.constraint(
      equalTo: self.view.safeAreaLayoutGuide.topAnchor
    ).isActive = true
  } else {
    navigationBar.topAnchor.constraint(
      equalTo: topLayoutGuide.bottomAnchor
    ).isActive = true
  }
  navigationBar.autoPinEdge(toSuperviewEdge: .left)
  navigationBar.autoPinEdge(toSuperviewEdge: .right)
  navigationBar.delegate = self
...

public func position(for bar: UIBarPositioning) -> UIBarPosition
  return .topAttached
}

这是使用purelayout DSL进行一些自动布局调用(https://github.com/PureLayout/PureLayout)

可以通过/sf/ask/17360801/获得答案


推荐阅读
author-avatar
让安丷全筑起心灵的屏障
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有