我是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
报告常量值并不符合我的需求。
答案 0 :(得分:6)
您可以使用intrinsicContentSize
根据其内容报告所需的视图大小。此值可随内容更改而更改,但您需要在invalidateIntrinsicContentSize
时调用。
此intrinsicContentSize
与contentHuggingPriority
,contentCompressionResistancePriority
一起使用,以及超视图中的其他布局约束,以确定实际的布局大小。
在您的情况下,听起来您希望根据视图内容报告理想大小,更改大小并在内容更改时使其无效,并使用布局约束与兄弟视图和父视图进行压缩(或根据需要抵抗。
答案 1 :(得分:2)
请注意,在自动布局环境中systemLayoutSizeFittingSize
即使更改布局也不会调用。它是一种在视图完成布局后计算视图大小的方法。
内在内容大小仅涉及视图本身的数据,而不涉及其他视图中的数据。请记住,您还可以在任何视图上设置恒定的宽度或高度限制,如果这些尺寸不会随着视图内容的变化而变化,则您不需要覆盖instrinsicContentSize
如果使用- (void)updateConstraints
方法更新了它的约束,则视图会更新它的内容大小,这意味着您可以覆盖此方法以观察其变化&#39 ;约束。由于您希望在特定宽度条件下重新排列视图,因此最佳做法是使用此- (void)layoutSubviews
方法,该方法将调用视图框架的更改。
- (void)layoutSubviews {
[super layoutSubviews];
// do your view arrangement based on width
// apple custom constraint here
}