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

时间:2015-01-03 19:59:32

标签: swift uiview ios8 frame

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

修改
我想在UIView子类中执行此操作,因为我将CAGradientLayer图层(与我的视图具有相同的大小)添加到我的自定义UIView。必须有一种比在UIViewController viewDidLayoutSubviews方法中设置视图更好的方法。

有两个垂直约束(超级视图的尾随和前导空间),用于调整自定义视图的宽度。但是在上述方法中宽度为600,而不是屏幕宽度。

3 个答案:

答案 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获取大小。