如何获取已通过 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 添加动画?