为 ViewController 设置约束条件
Set Constraints for ViewController presented
我正在推动 ViewController 超过我目前的 ViewController。
我想推送的ViewController是一个WebView,不过我估计没关系。
我希望显示的 ViewController 不在状态栏下方。但是如何设置这些约束?
这是我加载推送的代码 ViewController:
@objc func loadWebView(sender: UIButton) {
let vc = WebViewVC()
webViewVC = vc
self.present(webViewVC!, animated: true, completion: nil)
}
如果我为 webViewVC.view 设置与父视图 ViewController 相关的约束,它当然会告诉我这是不允许的,因为视图位于不同的视图层次结构中。
这是我在 WebViewVC 中设置布局的方式:
func setUpView() {
let view = UIView()
self.view = view
view.st(navigationBar,webView)
navigationBar.heightAnchor.constraint(equalTo: webView.heightAnchor, multiplier: 0.1).isActive = true
navigationBar.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
navigationBar.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
navigationBar.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
navigationBar.bottomAnchor.constraint(equalTo: webView.topAnchor, constant: 0).isActive = true
webView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
webView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
webView.topAnchor.constraint(equalTo: navigationBar.bottomAnchor, constant: 0).isActive = true
webView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
}
根据 Apple 文档:
The layout guide representing the portion of your view that is unobscured by bars and other content.
将您的导航栏顶部锚点更改为:
if #available(iOS 11, *) {
let guide = view.safeAreaLayoutGuide
navigationBar.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true
} else {
navigationBar.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true
}
webView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
视图是您的 self.view 而不是创建的新视图 (view = UIView() )
我正在推动 ViewController 超过我目前的 ViewController。
我想推送的ViewController是一个WebView,不过我估计没关系。
我希望显示的 ViewController 不在状态栏下方。但是如何设置这些约束?
这是我加载推送的代码 ViewController:
@objc func loadWebView(sender: UIButton) {
let vc = WebViewVC()
webViewVC = vc
self.present(webViewVC!, animated: true, completion: nil)
}
如果我为 webViewVC.view 设置与父视图 ViewController 相关的约束,它当然会告诉我这是不允许的,因为视图位于不同的视图层次结构中。
这是我在 WebViewVC 中设置布局的方式:
func setUpView() {
let view = UIView()
self.view = view
view.st(navigationBar,webView)
navigationBar.heightAnchor.constraint(equalTo: webView.heightAnchor, multiplier: 0.1).isActive = true
navigationBar.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
navigationBar.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
navigationBar.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
navigationBar.bottomAnchor.constraint(equalTo: webView.topAnchor, constant: 0).isActive = true
webView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
webView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
webView.topAnchor.constraint(equalTo: navigationBar.bottomAnchor, constant: 0).isActive = true
webView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
}
根据 Apple 文档:
The layout guide representing the portion of your view that is unobscured by bars and other content.
将您的导航栏顶部锚点更改为:
if #available(iOS 11, *) {
let guide = view.safeAreaLayoutGuide
navigationBar.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true
} else {
navigationBar.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true
}
webView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
视图是您的 self.view 而不是创建的新视图 (view = UIView() )