如何获取已通过 snapkit 设置的 UIView 的框架

Posted

技术标签:

【中文标题】如何获取已通过 snapkit 设置的 UIView 的框架【英文标题】:How to get the frame of a UIView that has been setup through snapkit 【发布时间】:2019-04-03 10:15:46 【问题描述】:

首先,我真的要感谢构建 snapkit 的人。它确实使为 UIViews 设置约束变得非常容易。

但现在,我有一个简单的问题:如何访问使用此库设置的视图的框架属性?

例如:

self.view.addSubview(contributePosterView)
self.contributePosterView.snp.makeConstraints  (make) in
    make.left.equalTo(self.view.snp.left)
    make.width.equalTo(self.view.bounds.width)
    make.top.equalTo(self.table.snp.bottom)
    make.bottom.equalTo(self.view.snp.bottom)

如何访问我命名为contributePosterView 的视图的框架属性?

这对我来说很重要,尤其是当我必须使用上述滚动视图的 layoutSubviews 属性在 UIScrollview 中设置它们时。

我尽可能多地检查了 snapkit 文档,但仍然没有找到答案。

我应该怎么做?任何帮助将不胜感激。

【问题讨论】:

为什么要访问frame?你想做什么? 我需要它来获取所述 UIView 的尺寸,以便为我的滚动视图确定正确的内容大小 从未使用过 snapkit,但是对于任何视图,如果您在该视图的父视图中实现了 layoutSubviews,则可以得到正确的 frame @PavanVasan - 如果您正确使用自动布局,则不需要设置滚动视图的.contentSize...它是自动设置的。如果确实需要获取contributePosterView的大小,可以通过contributePosterView.frame获取。但是请注意,在自动布局完成其工作之前,不会设置框架。一般框架在didLayoutSubviews()有效。 @DonMag: 你是在暗示 viewDidLayoutSubviews() 吗? 【参考方案1】:

“SnapKit”提供了添加约束的方法,使用的语法比默认的NSLayoutContraint 方法更容易。但是,它不会对视图做任何事情,从而无法获得最终的帧大小。

问题是您可能会在viewDidLoad() 中进行“快速”调用,然后立即尝试获取帧。那时,所发生的只是添加了约束,但自动布局还没有完成它的工作。

您要覆盖viewDidLayoutSubviews(),此时您可以获得有效的帧大小:

override func viewDidLayoutSubviews() 
    super.viewDidLayoutSubviews()

    // now you can get the resulting frame
    let f = self.contributePosterView.frame

   // do what you want with the frame

【讨论】:

以上是关于如何获取已通过 snapkit 设置的 UIView 的框架的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SnapKit 中按比例设置边缘偏移与超级视图高度的大小

SnapKit:如何以编程方式为 TableView 单元中的项目设置布局约束

如何通过 swift 3 的 snapkit 向任何 UI 添加动画?

如何让 SnapKit 约束左右边缘?

如何在 SnapKit 中设置 heightAnchor 的乘数 - swift

读 SnapKit 和 Masonry 自动布局框架源码(轉)