我正在对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
报告常量值不符合我的需求。
intrinsicContentSize
没有帮助?这正是您的自定义视图可以向布局系统报告其所需大小的确切位置。 - psciintrinsicContentSize
没有方法参数说明视图可以占用多少空间。我更新了我的问题以提到这一点。 - DmitryintrinsicContentSize
是报告UIView
所需大小的正确方法,但你的问题是如何指定多个有效大小。不幸的是,我不认为使用自动布局可以直接实现这一点。 - Anthony MattoxsizeThatFits
函数,这个函数必须由 ViewController 调用(类似于以下内容: override func viewDidLayoutSubviews() { updateHeight() } fileprivate func updateHeight() { stats.layoutIfNeeded() let wantedSize=stats.sizeThatFits(stats.bounds.size) if wantedSize.height != statsHeightConstraint.constant { statsHeightConstraint.constant=wantedSize.height view.layoutIfNeeded() } } - Dmitry