NSOutlineView 内的 NSTableView 和 NSView-Encapsulated-Layout-Height
NSTableView inside NSOutlineView and NSView-Encapsulated-Layout-Height
我正在 OS X 10.10.5 上使用 Swift 和 Xcode 6.4 构建一个 OS X 应用程序。
在我的应用程序的特定视图上,我希望在数据模型编辑器上有一个像 this 一个 Xcode 的视图。
我尝试使用 OutlineView 复制此视图,其中每个 "row" 都有一个标题和一个 TableView 加上两个按钮(用于加号和减号按钮)。出于测试目的,我将 TableView+Buttons 的标题分开,类似于 this(这是许多不同尝试之一)。
除了具有 TableView+Buttons 的视图之外,一切都按预期工作,它永远不会超过 17 像素。如果我在一个视图中定义所有内容,我会遇到同样的问题。我已经尝试定义所需的约束,但在那种情况下,存在一个似乎自动称为 NSView-Encapsulated-Layout-Height 的约束问题,它强制高度为 17 像素:
NSLayoutConstraint:0x61800008ea10 'NSView-Encapsulated-Layout-Height'
> V:[NotesTable(17)] (Names: NotesTable:0x60000012e2e0 )
我没有为 17 像素定义任何约束,我尝试使用一些通常会插入自动约束的参数进行测试 (autoresizesSubviews/translatesAutoresizingMaskIntoConstraints/autoresizingMask),但我只能转换 'special' 约束转换为另一种格式,增长不会变大。
尝试搜索网络,但我只找到封装约束有意义且有用的情况。
您知道在哪里或如何禁用该约束或将其值更改为我需要的高度吗?
Table 和 OS X 上的大纲视图不支持根据单元格视图的动态高度自动确定行高。它们要么具有显式静态行高、由单元格视图的设计时高度确定的静态行高,要么由委托及其 -tableView:heightOfRow:
或 -outlineView:heightOfRowByItem:
的实现确定的动态行高。
对于您的情况,您将必须实施委托方法。此外,委托方法无法查询实际的单元格视图,因为它可能不存在并且大纲视图在创建它之前需要行高。因此,代表必须以其他方式计算它。
一种方法是保留原型单元格视图的独立视图层次结构。当代理被要求提供行高时,它会像 row/item 的实际单元格视图一样配置视图层次结构,强制它自行布局,然后查询其高度。配置视图层次结构可能与设置顶级视图的 objectValue
一样简单(如果它是 NSTableCellView
、控件或以其他方式实现 setter)。但是,如果您的委托进行了其他配置,例如在其 -outlineView:viewForTableColumn:item:
方法中,那么您需要为这个原型视图层次结构复制它。
此外,当任何影响行高的因素发生变化时,您必须调用大纲视图的 -noteHeightOfRowsWithIndexesChanged:
方法让它知道,因此它会重新查询您的 ...heightOfRow...
方法.
最后,裸 table 视图并不是特别适合受限于兄弟视图或其父视图。他们真的很想生活在滚动视图中并继续使用 springs-and-struts 来定位和调整自己的大小。有关对此的讨论,请参阅 。这可能在 OS 的最新版本中得到了改进。无论如何,您将不得不观察 table 视图的帧更改通知(并要求它 post 此类通知)才能知道它何时增长。并且您设置约束以将其与单元视图层次结构中的任何其他视图相关联的能力将受到严重限制,因为它需要 translatesAutoresizingMaskIntoConstraints
打开。
我正在 OS X 10.10.5 上使用 Swift 和 Xcode 6.4 构建一个 OS X 应用程序。 在我的应用程序的特定视图上,我希望在数据模型编辑器上有一个像 this 一个 Xcode 的视图。
我尝试使用 OutlineView 复制此视图,其中每个 "row" 都有一个标题和一个 TableView 加上两个按钮(用于加号和减号按钮)。出于测试目的,我将 TableView+Buttons 的标题分开,类似于 this(这是许多不同尝试之一)。
除了具有 TableView+Buttons 的视图之外,一切都按预期工作,它永远不会超过 17 像素。如果我在一个视图中定义所有内容,我会遇到同样的问题。我已经尝试定义所需的约束,但在那种情况下,存在一个似乎自动称为 NSView-Encapsulated-Layout-Height 的约束问题,它强制高度为 17 像素:
NSLayoutConstraint:0x61800008ea10 'NSView-Encapsulated-Layout-Height' > V:[NotesTable(17)] (Names: NotesTable:0x60000012e2e0 )
我没有为 17 像素定义任何约束,我尝试使用一些通常会插入自动约束的参数进行测试 (autoresizesSubviews/translatesAutoresizingMaskIntoConstraints/autoresizingMask),但我只能转换 'special' 约束转换为另一种格式,增长不会变大。
尝试搜索网络,但我只找到封装约束有意义且有用的情况。
您知道在哪里或如何禁用该约束或将其值更改为我需要的高度吗?
Table 和 OS X 上的大纲视图不支持根据单元格视图的动态高度自动确定行高。它们要么具有显式静态行高、由单元格视图的设计时高度确定的静态行高,要么由委托及其 -tableView:heightOfRow:
或 -outlineView:heightOfRowByItem:
的实现确定的动态行高。
对于您的情况,您将必须实施委托方法。此外,委托方法无法查询实际的单元格视图,因为它可能不存在并且大纲视图在创建它之前需要行高。因此,代表必须以其他方式计算它。
一种方法是保留原型单元格视图的独立视图层次结构。当代理被要求提供行高时,它会像 row/item 的实际单元格视图一样配置视图层次结构,强制它自行布局,然后查询其高度。配置视图层次结构可能与设置顶级视图的 objectValue
一样简单(如果它是 NSTableCellView
、控件或以其他方式实现 setter)。但是,如果您的委托进行了其他配置,例如在其 -outlineView:viewForTableColumn:item:
方法中,那么您需要为这个原型视图层次结构复制它。
此外,当任何影响行高的因素发生变化时,您必须调用大纲视图的 -noteHeightOfRowsWithIndexesChanged:
方法让它知道,因此它会重新查询您的 ...heightOfRow...
方法.
最后,裸 table 视图并不是特别适合受限于兄弟视图或其父视图。他们真的很想生活在滚动视图中并继续使用 springs-and-struts 来定位和调整自己的大小。有关对此的讨论,请参阅 translatesAutoresizingMaskIntoConstraints
打开。