报告UIView子类所需大小的正确方法是什么?

时间:2015-09-30 09:57:51

标签: ios swift uiview

我是UIView的子类,无法找到正确的方式来请求/报告其所需的大小。我期望systemLayoutSizeFittingSize能够做到这一点,但它从未被调用过。布局很简单 - 我将视图顶部和顶部固定,并限制尾部和底部小于或等于顶级视图。在所有大小调整函数中,只调用了intrinsicContentSize,但这个函数不是很有帮助。

import Foundation
import UIKit

class StatsView: UIView
{
  override func drawRect(rect: CGRect)
  {
    let context=UIGraphicsGetCurrentContext()!
    CGContextSetRGBFillColor(context, 0, 0, 1, 1)
    CGContextFillRect(context, rect)
  }

  override func sizeThatFits(size: CGSize) -> CGSize
  {
    print("Called sizeThatFits with \(size)")
    if(size.width>350)
    {
      return CGSize(width: 350,height: 50)
    }
    else
    {
      return CGSize(width: 50,height: 100)
    }
  }

  override func systemLayoutSizeFittingSize(size: CGSize) -> CGSize
  {
    print("Called systemLayoutSizeFittingSize with \(size)")
    return super.systemLayoutSizeFittingSize(size)
  }

  override func systemLayoutSizeFittingSize(size: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize
  {
    print("Called systemLayoutSizeFittingSize with \(size)")
    if(size.width>350)
    {
      return CGSize(width: 350,height: 50)
    }
    else
    {
      return CGSize(width: 50,height: 100)
    }
  }

  override func intrinsicContentSize() -> CGSize
  {
    super.intrinsicContentSize()
    print("Called intrinsicContentSize")
    return CGSize(width: 10,height: 50)
  }
}

这是一种正确的方法吗?

更新我希望我的视图有一些信息,而不仅仅是一个蓝色矩形。有一些“最佳”宽度,但如果视图不能从其父级中获得那么多,则可以通过重新排列信息来补偿使用更多高度。因此,从intrinsicContentSize报告常量值并不符合我的需求。

2 个答案:

答案 0 :(得分:6)

您可以使用intrinsicContentSize根据其内容报告所需的视图大小。此值可随内容更改而更改,但您需要在invalidateIntrinsicContentSize时调用。

intrinsicContentSizecontentHuggingPrioritycontentCompressionResistancePriority一起使用,以及超视图中的其他布局约束,以确定实际的布局大小。

在您的情况下,听起来您希望根据视图内容报告理想大小,更改大小并在内容更改时使其无效,并使用布局约束与兄弟视图和父视图进行压缩(或根据需要抵抗。

答案 1 :(得分:2)

请注意,在自动布局环境中systemLayoutSizeFittingSize即使更改布局也不会调用。它是一种在视图完成布局后计算视图大小的方法。

内在内容大小仅涉及​​视图本身的数据,而不涉及其他视图中的数据。请记住,您还可以在任何视图上设置恒定的宽度或高度限制,如果这些尺寸不会随着视图内容的变化而变化,则您不需要覆盖instrinsicContentSize

如果使用- (void)updateConstraints方法更新了它的约束,则视图会更新它的内容大小,这意味着您可以覆盖此方法以观察其变化&#39 ;约束。由于您希望在特定宽度条件下重新排列视图,因此最佳做法是使用此- (void)layoutSubviews方法,该方法将调用视图框架的更改。

- (void)layoutSubviews { 
    [super layoutSubviews];
    // do your view arrangement based on width
    // apple custom constraint here
}