【发布时间】:2015-09-30 09:57:50
【问题描述】:
我正在继承 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没用?这是您自定义视图可以向布局系统报告其所需大小的确切位置。 -
@psci 请看代码。我希望我的自定义视图有一些信息,而不仅仅是一个蓝色矩形。有一些“最佳”宽度,但如果视图不能从它的父级获得那么多,它可以通过重新排列信息以使用更多高度来补偿。
intrinsicContentSize没有方法的参数来说明视图可以占用多少空间。我更新了我的问题以提及它。 -
这是一个有趣的问题。有一个更具描述性的标题可能会有所帮助。正如已经回答的那样,
intrinsicContentSize是报告UIView所需大小的正确方法,但您的问题是如何指定 多个 有效大小。不幸的是,我认为开箱即用的自动布局是不可能的。 -
@Dmitry 我有一个非常相似的用例,这里的答案并没有真正的帮助。你有没有想过?
-
@manmal 不是我想要的方式。我在视图中留下了
sizeThatFits函数,该函数必须由 ViewController 调用(类似这样:覆盖 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() } }