当内在大小溢出可用宽度

时间:2016-10-20 20:46:57

标签: macos cocoa autolayout today-extension nsautolayout

我正在玩一个(macOS)今天的列表小部件,我正在使用autolayout来调整小部件的大小。该小部件包含一个自定义NSView,呈现一些预先格式化的文本(非常类似于HTML pre标记)。

根据正在渲染的文本,窗口小部件具有内在内容大小。如果设定的框架大于或小于内在尺寸,它也可以正确(向下或向上)和中心缩放。

除了一个之外,这在许多情况下通常都很有效。当显示为“今日”窗口小部件时,窗口小部件的宽度将限制为特定大小。即使内在尺寸大于可用宽度,这也很好,它会缩小。 然而似乎autolayout似乎仍然按原样使用小部件的固有高度,尽管宽度受到限制。这样我的视图就显示在高度上,如下所示:

/------------------\
|    extra pad     |
|------------------|
|                  |
|  downsized view  |
|                  |
|------------------|
|    extra pad     |
\------------------/

示例:正在渲染的视图的内在大小为800x400,今天视图的宽度为400.视图按属性缩小为400x200,但布局高度似乎仍然是原始400(顶部和底部200填充)。

问题:如何告诉autolayout将扩展考虑在内。它听起来几乎像-intrinsicSizeForMaxSize:将需要。

我尝试设置宽度/高度比约束,降低压缩阻力并增加拥抱优先级,但这并不会消除额外的填充。我想我错过了autolayout在溢出时如何考虑内在大小的内容。

1 个答案:

答案 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]|将视图固定到容器上,用于横向和纵向。