作者:让安丷全筑起心灵的屏障 | 来源:互联网 | 2023-01-17 15:43
刚下载了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/获得答案