4

NSTableViewThingsがレイアウトを行う方法と同様 のものを構築しようとしています。Things 2.0 -- (c) CulturedCode

彼らがやっていることはNSTableView、カスタム描画されたを使用していると思いますNSTableCell-または、おそらくそれは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

かなり自明のようですが、実際には機能しません。制約を満たすことができないというエラーが発生します。サブクラス内で autolayout を使用することはできませんNSTableCellViewか?

4

1 に答える 1

3

テーブルビューコントローラーに追加のコードを導入する必要がありますが、可能です:

- (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 にするため (テーブル ビュー データソース メソッドを使用)、制約に関するエラー メッセージが生成されます。しかし、あなたの制約はセルの高さを設定して、それらが満たされるようにしたいと考えています。両方同時に動作することはできません。

于 2014-02-24T07:16:45.577 に答える