Автомакет внутри NSTableView на основе представления

У меня есть NSTableView (на основе представления), который создает строку;

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    TaskTableCellView *tableCellView = [[TaskTableCellView alloc] init];
    return tableCellView;
}

-(void) tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row {
    NSView *view = [rowView viewAtColumn:0];
    [view setTranslatesAutoresizingMaskIntoConstraints:NO];
    NSDictionary *views = NSDictionaryOfVariableBindings(view);
    [tableView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:views]];
    [tableView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:nil views:views]];
}

- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row {
    return 20;
}

Эта строка создает некоторые подпредставления и назначает некоторые ограничения;

- (void)layout {
    [super layout];
    ViewWithBackground *viewWithBackground = [[ViewWithBackground alloc] init];
    viewWithBackground.backgroundColor = [NSColor greenColor];
    [self addSubview:viewWithBackground];

    [viewWithBackground setTranslatesAutoresizingMaskIntoConstraints:NO];
    NSDictionary *views = NSDictionaryOfVariableBindings(viewWithBackground);
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[viewWithBackground]|"
                                                                 options:0
                                                                 metrics:nil
                                                                   views:views]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[viewWithBackground]|"
                                                                 options:0
                                                                 metrics:nil
                                                                   views:views]];

    [viewWithBackground setContentHuggingPriority:200 forOrientation:NSLayoutConstraintOrientationVertical];
    [viewWithBackground setContentHuggingPriority:200 forOrientation:NSLayoutConstraintOrientationHorizontal];
}


- (void)drawRect:(NSRect)dirtyRect {
    [[NSColor redColor] set];
    NSRectFill(dirtyRect);
    [super drawRect:dirtyRect];
}

Самое интересное начинается, когда я на самом деле пытаюсь отредактировать ограничения. viewWithBackground — это просто пустой NSView, который устанавливает свой фон. Когда ограничение |[viewWithBackground]| как по горизонтали, так и по вертикали я получаю ожидаемый результат - зеленые строки. Когда я меняю его на самый простой |-[viewWithBackground]-|, я получаю совершенно неожиданный результат — красные строки и никаких признаков моего зеленого вида!

Есть ли какой-то дополнительный шаг, который я должен предпринять здесь? Моя цель состоит в том, чтобы мой viewWithBackground на самом деле был немного меньшим представлением, чтобы имитировать «пробелы» между строками и расстоянием от краев представления таблицы.


person XeroxDucati    schedule 26.02.2014    source источник


Ответы (1)


На случай, если кто-нибудь когда-нибудь наткнется на это ... оказывается, что NSTableCellView немного шаткий без минимального размера - добавление (> = 10) к вертикальному ограничению позаботилось о проблеме.

person XeroxDucati    schedule 27.02.2014