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 有限制吗?的主要内容,如果未能解决你的问题,请参考以下文章

将 func loadview 中声明的 self.view 约束到视图控制器的部分区域

mysql关于行长度有限制吗

Post 提交,参数长度有限制吗

Java对类名长度有限制吗?

Post 提交,参数长度有限制吗

网站的keywords有字数限制吗?