刚刚下载了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,
答案 0 :(得分:21)
你的代码总是错的。您不应该自己设置手动添加的导航栏的高度,也不应将其放在视图的顶部。您应该将导航栏的顶部固定到状态栏的底部,并使用UIBarPositioningDelegate机制将其位置设置为.topAttached
,这将使其在状态栏下正确拉伸。
(但你也应该问自己为什么你手动添加导航栏。通常没有理由不将你的视图控制器包装在UINavigationController中 - 即使你不打算做任何实际的导航 - 只需获取导航栏,并进行所有自动管理。)
答案 1 :(得分:5)
请参阅ios 11 custom navbar goes under status bar / ios 11 navigation bar overlap status bar获取答案
不确定这是否是同一个问题,但我们在升级到iOS 11时遇到了这个问题。
请参阅ios 11 custom navbar goes under status bar
我们手动将导航栏高度设置为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)
答案 2 :(得分:3)
将导航栏添加到视图后,尝试添加一些自动布局约束
if #available(iOS 11.0, *) {
newNavbar.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
newNavbar.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
newNavbar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
newNavbar.heightAnchor.constraint(equalToConstant: 64).isActive = true
}
你可以在早期版本的iOS中使用除第三个约束之外的所有约束,但是如果它在早期版本中都可以使用,你可能不想搞砸它。
使用安全布局区域应将导航栏保留在状态栏下。
答案 3 :(得分:1)
首先,确保您的导航控制器显示导航栏"在故事板中未经检查。
然后,从"对象库中拖放导航栏"。将Top约束设为20。
它还可以在iPhone X模拟器"中完美地工作。
快乐的编码!
答案 4 :(得分:1)
在Swift 4.1中尝试过此解决方案
let menuBar: UIView = {
let mb = UIView()
mb.backgroundColor = .red
mb.translatesAutoresizingMaskIntoConstraints = false
return mb
}()
private func setupMenuBar(){
view.addSubview(menuBar)
let constraints = [ menuBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
menuBar.leadingAnchor.constraint(equalTo: view.leadingAnchor),
menuBar.trailingAnchor.constraint(equalTo: view.trailingAnchor),
menuBar.heightAnchor.constraint(equalToConstant: 50)]
NSLayoutConstraint.activate(constraints)
}