在其子类中获取自定义 UIView 的框架大小的位置

Where to get frame size of custom UIView in its subclass

当我使用情节提要添加自定义 UIView 时,何时计算 UIView 的正确帧大小? 我无法在 UIView 的 init(frame: CGRect)init(coder aDecoder: NSCoder)awakeFromNib() 中获得正确的帧大小。我在 override func layoutSubviews() 中得到了正确的大小,但是这次视图没有添加到视图控制器的视图中。

编辑:
我想在 UIView 子类中执行此操作,因为我向自定义 UIView 添加了一个 CAGradientLayer 层(与我的视图大小相同)。肯定有比在 UIViewControllers viewDidLayoutSubviews 方法中设置视图更好的方法。

有两个垂直约束(到超级视图的尾部和前导 space)调整我的自定义视图的宽度。但是上述方法中的宽度是600,不是屏幕宽度。

您的 UIView 应该有一个 IBOutlet,在 viewDidLayoutSubviews() 方法中,通过 yourViewOutlet.frame.size 获取大小。

由于 viewDidLayoutSubviews() 被多次调用,我建议使用 viewDidAppear() 委托。

viewDidLoad() 在设置任何帧之前被调用。

viewDidLayoutSubviews() 在调整帧大小期间被调用,并且将以不同的帧大小调用多次(通常是在计算帧之前的 frameZero)。

viewDidAppear()所有帧都已设置。

func viewWillAppear(_ animated: Bool)

在视图层次就位并设置几何后,在 viewController 上调用此方法。

它通常是安排与几何有关的 viewController 代码的最佳位置,并且在过渡动画 运行 之前被调用。

随后调用 viewDidAppear,在过渡动画完成后调用。

更新

因为您想直接在自定义视图中设置它(而不是在 viewController 中),要覆盖的适当 UIView 函数是 layoutSubviews。请务必在覆盖中调用 super.layoutSubviews()

override func layoutSubviews() {
    super.layoutSubviews()
    //self.frame will be correct here
}

这将在 viewController 的 viewWillAppear 之后和 viewDidAppear

之前调用

更新 2:collectionView 单元格 集合视图单元格从集合视图的布局中获取它们的框架数据。当一个单元格需要知道它的几何形状时,您可以覆盖 applyLayoutAttributes

func applyLayoutAttributes(_ layoutAttributes: UICollectionViewLayoutAttributes!)

默认布局属性之一是框架 属性。另请参阅我在下面关于如何直接从 collectionView.layout.

中提取框架的评论