我正在玩一个(macOS)今天的列表小部件,我正在使用autolayout来调整小部件的大小。该小部件包含一个自定义NSView,呈现一些预先格式化的文本(非常类似于HTML pre
标记)。
根据正在渲染的文本,窗口小部件具有内在内容大小。如果设定的框架大于或小于内在尺寸,它也可以正确(向下或向上)和中心缩放。
除了一个之外,这在许多情况下通常都很有效。当显示为“今日”窗口小部件时,窗口小部件的宽度将限制为特定大小。即使内在尺寸大于可用宽度,这也很好,它会缩小。 然而似乎autolayout似乎仍然按原样使用小部件的固有高度,尽管宽度受到限制。这样我的视图就显示在高度上,如下所示:
/------------------\
| extra pad |
|------------------|
| |
| downsized view |
| |
|------------------|
| extra pad |
\------------------/
示例:正在渲染的视图的内在大小为800x400,今天视图的宽度为400.视图按属性缩小为400x200,但布局高度似乎仍然是原始400(顶部和底部200填充)。
问题:如何告诉autolayout将扩展考虑在内。它听起来几乎像-intrinsicSizeForMaxSize:将需要。
我尝试设置宽度/高度比约束,降低压缩阻力并增加拥抱优先级,但这并不会消除额外的填充。我想我错过了autolayout在溢出时如何考虑内在大小的内容。
答案 0 :(得分:0)
从使用内在大小切换到比率约束。我仍然计算视图的“原生”大小,但只用它来计算宽度/高度比。然后我添加一个约束来保持这个比例。似乎工作正常。以下是相关代码:
let size = nativeSize // calculate the desired size
let ratio = size.height / size.width
if let rc = ratioConstraint {
rc.isActive = false
removeConstraint(rc)
}
ratioConstraint =
NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal,
toItem: self, attribute: .width,
multiplier: ratio, constant: 0)
ratioConstraint?.isActive = true
然后我只是通过|[self]|
将视图固定到容器上,用于横向和纵向。