使intrinsicContentSize适应外部约束

时间:2018-05-05 01:38:36

标签: swift nsview appkit

上下文

我经常遇到单个NSTextView中需要多个NSStackView的情况。当然,Auto Layout对此不满意,因为这会使高度模糊(假设堆栈视图未设置为同等填充)。即使在添加约束来解决这些问题之后,macOS Interface Builder似乎也有一个错误,它在被问到时拒绝实际更新帧。

出于这个原因和其他原因,我正在尝试创建一个TextBox类(子类NSView)来封装NSTextView(以及关联的滚动视图)并包含内在内容大小避免布局问题。内在内容大小将根据用户指定的最小和最大行数计算(无需滚动即可显示)。换句话说,最多只有一定数量的行,TextBox会自行调整大小,以便不需要滚动。

问题

这似乎需要intrinsicContentSize,这取决于帧宽。

但是,intrinsicContentSize文档states

  

您提供的内在大小必须独立于内容框架,因为无法根据更改的高度动态地将更改的宽度传达给布局系统。

但是,自动布局指南states

  

文本视图的内在内容大小取决于内容,是否启用了滚动以及应用于视图的其他约束。例如,启用滚动后,视图不具有内在内容大小。禁用滚动时,默认情况下,视图的内在内容大小是根据文本的大小计算的,不包含任何换行。例如,如果文本中没有返回值,则会计算将内容布局为单行文本所需的高度和宽度。如果添加约束以指定视图的宽度,则内在内容大小将定义显示给定宽度的文本所需的高度。

鉴于在文本视图中禁用滚动:

  

如果添加约束以指定视图的宽度,则内在内容大小定义显示给定宽度的文本所需的高度。

然后似乎有办法通过查看现有的约束来做我想做的事。

问题

如何定义根据指定宽度计算高度的内在内容大小,如上面最后一句引用中所述?

解决方案应该产生“上下文”中描述的效果,并且在堆栈视图中使用时不会产生错误或警告。

0 个答案:

没有答案