具有自动布局的基于 NSView table 的视图会增长,但不会收缩行

NSView-based table view with auto layout grows, but does not shrink rows

我有一个基于视图模式(不是基于单元格)的 NSTableView usesAutomaticRowHeights=YES。这些行具有可能随时更改的动态高度。此设置成功地增加了 table 视图行(行内容永远不会被剪裁),但是当行变短时,table 视图行不会收缩到固有的行视图高度。在布局后的 table 视图上调用 noteHeightOfRowsWithIndexesChanged: 似乎无法解决问题,我的 tableView:heightOfRow: 在 noteHeightOfRowsWithIndexesChanged:.

之后也没有再次调用

关于在具有可变行高的基于 NSView 的 table 视图中使用自动布局,我有什么 missed/isn 没有记录的吗?毕竟,增长行无需任何额外代码即可正常工作,它们只是不会自行收缩。

NSTableView* tv = [[NSTableView alloc] init];

[tv setTranslatesAutoresizingMaskIntoConstraints:NO];
[tv setUsesAutomaticRowHeights:YES];     // Use auto layout for row height

NSTableColumn* column = [[NSTableColumn alloc] init];
[tv addTableColumn:column];

// Set table view data source and delegate, rows are then loaded...

调试默认table视图布局好久,终于找到问题所在。当对行内容视图使用自动布局时,table 视图行视图带有一些干扰内容的 autoresizingmask 设置。您需要将 行视图的 translatesAutoresizingMaskIntoConstraints 设置为 NO。这可以使用委托方法 tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row:

为基于视图的 NSTableView 实现
- (void)tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row
{   
    // Remember that rowView != row content view!
    [rowView setTranslatesAutoresizingMaskIntoConstraints:NO];   // Disable constraints interfering with row view content
}

有趣的是,如果由于动态高度增加,内容没有缩小超过初始行高或它增长到的最大行高,这似乎不是问题。