在其子类中获取自定义 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
层(与我的视图大小相同)。肯定有比在 UIViewController
s 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.
中提取框架的评论
当我使用情节提要添加自定义 UIView 时,何时计算 UIView 的正确帧大小?
我无法在 UIView 的 init(frame: CGRect)
或 init(coder aDecoder: NSCoder)
或 awakeFromNib()
中获得正确的帧大小。我在 override func layoutSubviews()
中得到了正确的大小,但是这次视图没有添加到视图控制器的视图中。
编辑:
我想在 UIView 子类中执行此操作,因为我向自定义 UIView
添加了一个 CAGradientLayer
层(与我的视图大小相同)。肯定有比在 UIViewController
s 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.
中提取框架的评论