![](/img/trans.png)
[英]On iOS, if a view controller has no view yet, why does NSLog(@“self.view is %p”, self.view) crash?
[英]Does self.view has constraints?
self.view 在 ViewController 上。 它有什么限制嗎? 我發現它有一個頂部和一個左側約束。 它肯定有一個框架。 自動布局系統從 self.view 開始。 我的意思是直到 self.view iOS 系統仍然使用框架來定位視圖。 之后,我們的視圖可以通過自動布局添加。 所以在視圖控制器中,我使用 self.frame.size.width 作為我自己視圖的寬度約束是正確的做法嗎? 我對嗎?
使用SCREEN_WIDTH
並且很容易獲得您的設備大小並正確管理您自己的視圖:
let SCREEN_WIDTH : CGFloat = UIScreen.main.bounds.width
let SCREEN_HEIGHT : CGFloat = UIScreen.main.bounds.height
有關更多信息,您可以參考: 鏈接
示例:您應該以編程方式添加自己的新視圖。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let SCREEN_WIDTH : CGFloat = UIScreen.main.bounds.width
let SCREEN_HEIGHT : CGFloat = UIScreen.main.bounds.height
let newView = UIView()
newView.translatesAutoresizingMaskIntoConstraints = false
newView.backgroundColor = UIColor.black
newView.frame.size = CGSize(width: SCREEN_WIDTH * 0.5 , height: SCREEN_HEIGHT * 0.5)
self.view.addSubview(newView)
self.view.layoutIfNeeded()
}
}
在這里,我將框架賦予我的自定義視圖的約束。 我不想以 frame.size 的格式給出這個值。 我想使用像constraint.constant
這樣的東西。 我的意思是純粹的自動布局。
self.view.frame
僅在第一次調用viewDidLayoutSubviews()
時才准確,通常是在viewDidAppear
之前,這意味着如果您嘗試在viewDidLoad
或第一次viewWillAppear
中訪問該框架將是錯誤的。
因此,您應該只檢查viewDidLayoutSubviews()
(但請注意,只要布局更改,就會調用 function (這並不意味着您在表格視圖上滾動,這意味着實際約束會更改屏幕旋轉的 bc 或其他)
如果你不能等到那個方法或者有一些不是冪等的代碼並且不想有一些像hasSetup
bool 來確保你只做一次......那么你可以直接通過UIScreen.main.bounds
或者
我不一定會推薦以下內容,但為了完整起見,我還使用了一些技巧來讓視圖更早地布局,例如在視圖生命周期的早期或在初始化的視圖 controller 上調用view.layoutIfNeeded()
:
let myVC = MyViewController()
_ = myVC.view // fixes frame for some reason
您想使用約束,但如果您進行相對約束,則框架根本不重要。 Aka 而不是說height = constant
您會說“使其與 vc.view 具有相同的高度”或“使該視圖的前緣在 vc.view 的前緣右側 20 像素”。
就像是:
let myView = UIView()
self.view.addSubview(myView)
myView.translatesAutoresizingMaskIntoConstraints = false
myView.heightAnchor.constraint(equalTo: self.view.heightAnchor)
myView.leadingAnchor.constraint(equalTo: vc.view.leadingAnchor, constant: 20.0) // 20 pixels to right of vc.view leading
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.