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

Dmi*_*try 5 uiview ios swift

我是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)
  }
}
Run Code Online (Sandbox Code Playgroud)

什么是正确的方法呢?

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

Sco*_*t H 6

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

intrinsicContentSize与superview中的和,以及其他布局约束一起使用contentHuggingPriority,contentCompressionResistancePriority以确定实际的布局大小.

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

  • 对不起,但你的回答似乎太笼统了.让我举一个例子 - UILabel可以将它的高度排列为横向模式中的1行,纵向中的2行或者只有宽度的一半.我想达到类似的效果.这里没有内容更改,并且是父视图中唯一的子视图,拥抱和阻力并不重要.我知道如何借助ViewControllers级别的约束来做到这一点,但UILabel在没有它的情况下做得很好. (2认同)