当我使用storyboard添加自定义UIView时,是否计算了UIView的正确帧大小?
我无法在 UIView init(frame: CGRect)
或init(coder aDecoder: NSCoder)
或awakeFromNib()
中获得正确的帧大小。我在override func layoutSubviews()
中获得了正确的大小,但这次视图未添加到视图控制器的视图中。
修改
我想在UIView子类中执行此操作,因为我将CAGradientLayer
图层(与我的视图具有相同的大小)添加到我的自定义UIView
。必须有一种比在UIViewController
viewDidLayoutSubviews
方法中设置视图更好的方法。
有两个垂直约束(超级视图的尾随和前导空间),用于调整自定义视图的宽度。但是在上述方法中宽度为600,而不是屏幕宽度。
答案 0 :(得分:25)
func viewWillAppear(_ animated: Bool)
在视图层次结构就位并设置几何体之后,在viewController上调用此方法。
它通常是安排依赖于几何的viewController代码的最佳位置,并且在转换动画运行之前调用。
随后调用viewDidAppear
,在过渡动画完成后调用。{/ p>
<强>更新强>
因为你想直接在自定义视图中设置它(而不是在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!)
默认layoutAttributes之一是frame属性。另请参阅下面有关如何直接从collectionView.layout中提取帧的注释。
答案 1 :(得分:1)
由于多次调用viewDidLayoutSubviews()
,我建议您使用viewDidAppear()
代理。
viewDidLoad()
。
viewDidLayoutSubviews()
,并且将使用不同的帧大小调用多次(通常在计算帧之前为frameZero)。
viewDidAppear()
所有帧都已设置。
答案 2 :(得分:0)
您应该为您的UIView设置一个IBOutlet,并在viewDidLayoutSubviews()
方法中,按yourViewOutlet.frame.size
获取大小。