我正在尝试构建类似于事物如何布局的NSTableView.
我假设他们正在做的是使用带有自定义绘制的NSTableCell的NSTableView – 或者它可能是NSSegmentedControl.我试图沿着NSTableCell路线走下去.我试图子类化NSTableCellView并绘制一个自定义单元格(这都是在init方法中进行测试);
- (id)init { self = [super init]; if (self) { _checkBox = [[NSButton alloc] init]; [_checkBox setButtonType:NSSwitchButton]; _textview = [[NSTextView alloc] init]; [self addSubview:_checkBox]; [self addSubview:_textview]; [self setTranslatesAutoresizingMaskIntoConstraints:NO]; NSDictionary *views = NSDictionaryOfVariableBindings(_checkBox,_textview); [self addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_checkBox]-[_textview]|" options:0 metrics:nil views:views]]; } return self; } @end
看起来很明显,但它实际上并不起作用.我无法满足约束的错误.是否无法在子类NSTableCellView中使用autolayout?
解决方法
虽然您必须向表视图控制器引入一些额外的代码,但这是可能的:
- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row { NSTableCellView *rowView = [self.tableView makeViewWithIdentifier: RVIssueSelectionTableRowViewContentKey owner: self]; [rowView setObjectValue: yourDataObject]; // or update your cell with the according data the way you prefer [rowView setNeedsLayout: YES]; [rowView layoutSubtreeIfNeeded]; return [rowView fittingSize].height; }
这将导致单元格更新它的布局,您可以返回它所需的高度.因为这个调用可能有点贵,所以应该缓存计算的单元格高度.这个答案来自另一个我现在找不到的SO答案(当我找到它时会更新解决方案).生成约束的错误消息是因为您强制单元格的高度为x(通过表视图数据源方法).但是你的约束想要设置单元格的高度以使它们满意.两者同时都无法奏效.