2013-03-12 14 views
5

Ich versuche, eine NSTableView innerhalb einer NSScrollView (die Standardkonfiguration, das heißt) in Code, Auto-Layout verwenden. Ich kann nicht herausfinden, wie man das macht.NSTableView-Rahmen in einem NSClipView/NSScrollView mit Auto-Layout

Hier ist meine Loadview:

- (void)loadView 
{ 
    NSView *view = [[NSView alloc] init]; 

    NSScrollView *tableScroll = [[NSScrollView alloc] init]; 
    NSTableView *fileTable = [[NSTableView alloc] init]; 
    [tableScroll setDocumentView:fileTable]; 
    [tableScroll setHasVerticalScroller:YES]; 
    [tableScroll setHasHorizontalScroller:NO]; 
    fileTable.delegate = self; 
    fileTable.dataSource = self; 
    [fileTable setHeaderView:nil]; 
    [fileTable setAllowsColumnReordering:NO]; 

    NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"column1"]; 
    [fileTable addTableColumn:column]; 

    [tableScroll setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [fileTable setTranslatesAutoresizingMaskIntoConstraints:NO]; 

    [view addSubview:tableScroll]; 

    NSDictionary *topViews = NSDictionaryOfVariableBindings(tableScroll); 
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[tableScroll]|" options:0 metrics:nil views:topViews]]; 
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[tableScroll]|" options:0 metrics:nil views:topViews]]; 

    self.fileTable = fileTable; 

    self.view = view; 
} 

Was, dass mein Tisch passiert, ist Rahmen Sicht wird auf die Grenzen des NSClipView immer gleich sein. Die Ansicht befindet sich in einem Fenster und wird mit ihr skaliert, und wenn ich das mache, wird die Größe der Scrollview, der Clip-Ansicht und der Tabelle geändert, aber ich kann nie irgendwo scrollen.

Mit Blick auf Einschränkungen bekomme ich die NSScrollView erhält Einschränkungen, die die Clip-Ansicht, um es zu füllen, hat die Clip-Ansicht überhaupt keine Einschränkungen und die Tabellenansicht hat eine Reihe von Einschränkungen im Zusammenhang mit der NSTableRowViews drin.

Wenn ich eine Einschränkung wie |[fileTable(>=500)] der Clip-Ansicht hinzufügen, werde ich 500 Pixel NSTableView bekommen, aber natürlich will ich das nicht tun.

+0

Wenn ich Maskensatz für automatischen Größen 'tableScroll', rufen' setTranslatesAutoresizingMaskIntoConstraints: zu bejahen ist auf 'tableScroll' und' fileTable' und entfernen Sie die beiden 'addConstraints' nennt, funktioniert es ok und ich sehe' NSAutoresizingMaskLayoutConstraint' auf den Clip Ansicht, dass Spezifizieren Sie die genaue Größe 'FileTable' Bedürfnisse. –

Antwort

1

Obwohl dies durch das Plakat in den obigen Kommentaren beantwortet wurde, dachte ich, ich würde die Antwort hier (in das gleiche Problem geraten). Wenn Sie das automatische Layout übernehmen, deaktivieren Sie normalerweise "Masken in Abhängigkeiten umwandeln" in der Xib. Für Klassen wie NSScrollView und NSTableView sollten Sie jedoch im Allgemeinen ihre eigenen internen Ansichten verwalten, indem Sie ihre translatesAutoresizingMaskIntoConstraints-Eigenschaft auf YES festlegen. Es ist immer noch in Ordnung, Constraints, die externe sind, auf diese Ansichten festzulegen, d. H. Die Größe in Bezug auf ihre Superansicht zu ändern.

Wenn Sie translatesAutoresizingMaskIntoConstraints auf NO setzen, müssen Sie Einschränkungen für alle internen Ansichten angeben, die Sie nicht verwenden möchten, sofern Sie nicht speziell angepasstes Verhalten benötigen (fast nie). Dies war das spezifische Problem oben.

Ein offensichtlicher Nebeneffekt des nicht richtig einstellen ist, dass eine Tabelle (zum Beispiel) nicht ordnungsgemäß über das hinausgeht, was in der Ansicht sichtbar ist.

Verwandte Themen