self.view 有限制吗?
Posted
技术标签:
【中文标题】self.view 有限制吗?【英文标题】:Does self.view has constraints? 【发布时间】:2019-11-21 03:05:36 【问题描述】:self.view 在 ViewController 上。它有什么限制吗?我发现它有一个顶部和一个左侧约束。它肯定有一个框架。自动布局系统从 self.view 开始。我的意思是直到 self.view ios 系统仍然使用框架来定位视图。之后,我们的视图可以通过自动布局添加。所以在视图控制器中,我使用 self.frame.size.width 作为我自己视图的宽度约束是正确的做法吗?我说的对吗?
【问题讨论】:
我面临的问题是我有一个自定义视图,它将在内部逐行布局不同宽度的按钮。如果水平空间不足以放置下一个按钮。它将被放置在下一行的开头。如果我知道我的自定义视图的宽度,我可以自动布局所有按钮。但我通过使用我不喜欢的 .frame 来做到这一点。我想使用诸如 widthConstraint.const 之类的东西或其他东西。我的意思是自动布局而不是框架。对不起。一开始无法表达我想说的话。 【参考方案1】:使用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
之类的东西。我的意思是纯粹的自动布局。
【讨论】:
对不起。我正在尝试摆脱框架。我想纯粹使用约束。还是谢谢。 @Michael 欢迎您,但我还是不明白实际问题是什么,所以请您发布截图吗? 嗨,Anjali,我已经上传了我在这里遇到的问题。 你好@Michael,请更改 make.width.equalTo(self.view.size.width);到这一行:make.width.equalTo(self.view);【参考方案2】:self.view.frame
仅在第一次调用viewDidLayoutSubviews()
时才准确,通常在viewDidAppear
之前,这意味着如果您尝试访问viewDidLoad
或第一次访问viewWillAppear
,则框架将出错。
所以您应该只签入viewDidLayoutSubviews()
(但请注意,只要布局更改,就会调用该函数(这并不意味着您在表格视图上滚动,这意味着实际的约束会在屏幕旋转时发生变化,或者否则)
如果你不能等到那个方法或者有一些不是幂等的代码并且不想有像 hasSetup
bool 这样的代码来确保你只做一次......那么你可以访问屏幕大小直接通过UIScreen.main.bounds
或
我不一定会推荐以下方法,但为了完整起见,我还使用了一些技巧来让视图更早地布局,例如在视图生命周期的早期或在初始化的视图控制器上调用 view.layoutIfNeeded()
:
let myVC = MyViewController()
_ = myVC.view // fixes frame for some reason
在这里正确使用 AutoLayout
您想使用约束,但如果您进行相对约束,则框架根本不重要。 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
【讨论】:
我试图避免这些回调。我想使用一些关于约束的东西来做到这一点......无论如何,谢谢。 框架可以告诉您约束的常量应该是什么 - 而且....如果您使用自动布局,那么框架根本不重要。使用 vc.view 作为参考添加约束,当它完成布局时,所有约束将更新 bc 它们是相对的 所以它认为我在上传的屏幕截图中所做的一切都很好。我的意思是在 viewController 中为 self.view 的子视图设置自动布局常量时从框架中获取值以上是关于self.view 有限制吗?的主要内容,如果未能解决你的问题,请参考以下文章