【问题标题】:Where to get frame size of custom UIView in its subclass在其子类中获取自定义 UIView 的帧大小的位置
【发布时间】:2015-03-01 18:39:30
【问题描述】:

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

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

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

【问题讨论】:

  • I get the correct size in override func layoutSubviews() but this time the view is not added to the view controller's view. 为什么?
  • 我不知道。问题是关于这个的:)它没有出现。

标签: swift uiview ios8 frame


【解决方案1】:
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!)

其中一个默认的 layoutAttributes 是 frame 属性。另请参阅下面关于如何直接从 collectionView.layout 中提取框架的评论。

【讨论】:

  • I want to do this in the UIView subclass
  • I get the correct size in override func layoutSubviews() but this time the view is not added to the view controller's view 至少我看不到
  • 我想 super.layoutSubviews() 被遗忘了。或者我之前做错了什么。该死的,这是一个简单的赏金:)
  • 我不想让你接受这个简单的赏金 :) 类似的问题:有没有办法在 collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) 中获得正确大小的 collectionViewCell
  • @osrl - 一个快速(未经测试)的答案是询问集合视图的布局。像[collectionView.layout layoutAttributesForItemAtIndexPath:indexPath].frame 这样的东西可能会奏效。感谢您的赏金! //迅速:collectionView.layout.layoutAttributesForItemAtIndexPath(indexPath).frame
【解决方案2】:

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

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

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

viewDidAppear()所有帧都设置好了。

【讨论】:

  • 对不起,我添加了缺失的信息
【解决方案3】:

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

【讨论】:

  • 对不起,我添加了缺失的信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多