self.view 有限制吗?

Does self.view has constraints?

self.view 在 ViewController 上。它有任何限制吗?我发现它有一个顶部和一个左侧约束。它肯定有一个框架。自动布局系统从 self.view 开始。我的意思是,直到 self.view,iOS 系统仍在使用框架来定位视图。之后,我们的视图可以添加自动布局。那么在 viewcontroller 中,我使用 self.frame.size.width 作为我自己视图的宽度约束是正确的做法吗?我说得对吗?

使用 SCREEN_WIDTH 并且很容易获得您的设备尺寸并正确管理您自己的视图:

let SCREEN_WIDTH : CGFloat = UIScreen.main.bounds.width
let SCREEN_HEIGHT : CGFloat = UIScreen.main.bounds.height

更多信息请参考:link

示例: 您应该以编程方式添加自己的新视图。

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()(但请注意,每当布局更改时都会调用该函数(这并不意味着你在 table 视图上滚动,这意味着实际约束发生变化 bc ex 的屏幕旋转,或其他)

如果你不能等到那个方法或者有一些不是幂等的代码并且不想有一些像 hasSetup bool 来确保你只做一次......那么你可以通过 UIScreen.main.bounds

直接访问屏幕尺寸

我不一定会推荐以下内容,但为了完整起见,我还使用了一些技巧来使视图更早地进行布局,例如在视图生命周期或视图中更早地调用 view.layoutIfNeeded()初始化的控制器:

let myVC = MyViewController()
_ = myVC.view // fixes frame for some reason

此处正确使用AutoLayout

您想使用约束,但如果您进行相对约束,那么框架根本不重要。 Aka 而不是说 height = constant 你会说 "make this the same height as vc.view" 或 "make the leading edge of this view 20 pixels right of the leading edge of vc.view"。

类似于:

    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