【问题标题】:NSTableView inside NSOutlineView and NSView-Encapsulated-Layout-HeightNSOutlineView 和 NSView-Encapsulated-Layout-Height 内的 NSTableView
【发布时间】:2015-11-18 12:37:18
【问题描述】:

我正在 OS X 10.10.5 上使用 Swift 和 Xcode 6.4 构建一个 OS X 应用程序。 在我的应用程序的特定视图中,我希望在 Xcode 的数据模型编辑器中拥有类似 this 的视图。

我尝试使用 OutlineView 复制此视图,其中每个“行”都有一个标题和一个 TableView 加上两个按钮(用于加号和减号按钮)。出于测试目的,我将 TableView+Buttons 的标题分开,类似于 this(这是许多不同尝试之一)。

一切都按预期工作,除了具有 TableView+Buttons 的视图,它永远不会高于 17 像素。如果我在一个视图中定义所有内容,我也会遇到同样的问题。我已经尝试定义所需的约束,但在这种情况下,似乎自动的约束存在问题,称为 NSView-Encapsulated-Layout-Height,它将高度强制为 17 像素:

NSLayoutConstraint:0x61800008ea10 'NSView-Encapsulated-Layout-Height' > V:[NotesTable(17)](名称:NotesTable:0x60000012e2e0)

我没有对 17 像素定义任何约束,我尝试使用一些通常插入自动约束的参数进行测试(autoresizesSubviews/translatesAutoresizingMaskIntoConstraints/autoresizingMask),但我只能将“特殊”约束转换为另一种格式和增长没有变大。

试图搜索网络,但我只得到封装约束有意义且有用的情况。

您知道在哪里或如何禁用该约束或将其值更改为我需要的高度吗?

【问题讨论】:

    标签: xcode macos swift nstableview nsoutlineview


    【解决方案1】:

    OS X 上的表格和大纲视图不支持根据单元格视图的动态高度自动确定行高。它们要么具有显式静态行高,要么具有由单元格视图的设计时高度确定的静态行高,要么具有由委托及其实现-tableView:heightOfRow:-outlineView:heightOfRowByItem: 确定的动态行高。

    对于您的情况,您将不得不实现委托方法。此外,委托方法无法查询实际的单元格视图,因为它可能不存在,并且大纲视图在创建它之前需要行高。因此,委托必须以其他方式计算它。

    一种方法是保留原型单元格视图的独立视图层次结构。当委托被要求提供行高时,它会配置该视图层次结构,就像该行/项目的实际单元格视图一样,强制它自行布局,然后查询其高度。配置视图层次结构可能与设置顶级视图的objectValue 一样简单(如果它是NSTableCellView、控件或以其他方式实现设置器)。但是,如果您的委托进行其他配置,例如在其 -outlineView:viewForTableColumn:item: 方法中,那么您需要为这个原型视图层次结构复制它。

    另外,当任何会影响行高的因素发生变化时,你必须调用大纲视图的-noteHeightOfRowsWithIndexesChanged: 方法让它知道,所以它会重新查询你的...heightOfRow... 方法。

    最后,裸表视图并不特别适合被约束到同级视图或其父视图。他们真的很想生活在滚动视图中,并继续使用弹簧和支柱来定位和调整自己的大小。有关此问题的讨论,请参阅 my answer to another question。在最新版本的操作系统中,这可能已得到改进。无论如何,您将不得不观察表格视图的帧更改通知(并要求它发布此类通知)才能知道它何时增长。而且您设置约束以将其与单元视图层次结构中的任何其他视图相关联的能力将受到严重限制,因为它需要打开translatesAutoresizingMaskIntoConstraints

    【讨论】:

    • 非常感谢肯。
    猜你喜欢
    • 2016-03-04
    • 1970-01-01
    • 2015-04-09
    • 2015-10-09
    • 2021-05-21
    • 2017-02-01
    • 2021-09-01
    • 2015-01-13
    • 1970-01-01
    相关资源
    最近更新 更多