【问题标题】:How to get the frame of a UIView that has been setup through snapkit如何获取已通过 snapkit 设置的 UIView 的框架
【发布时间】: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() 吗?

标签: ios swift snapkit


【解决方案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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多