Search code examples
cocoanstableviewnsscrollviewnslayoutconstraint

Automatic Layout Constraints in NSScrollView


I'm creating an NSTableView inside a NSScrollView programmatically, but when I try to set the frame to the scroll view I'm getting a constraint error.

Unable to simultaneously satisfy constraints:
(
    "<NSAutoresizingMaskLayoutConstraint:0x107d4ec50 h=--& v=--& V:[NSScrollView:0x10068c570(372.5)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x107d4d020 h=-&- v=-&- V:[NSClipView:0x10068d7f0]-(673)-|   (Names: '|':NSScrollView:0x10068c570 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x107d4cfc0 h=-&- v=-&- V:|-(2)-[NSClipView:0x10068d7f0]   (Names: '|':NSScrollView:0x10068c570 )>"
)

Will attempt to recover by breaking constraint 
<NSAutoresizingMaskLayoutConstraint:0x107d4d020 h=-&- v=-&- V:[NSClipView:0x10068d7f0]-(673)-|   (Names: '|':NSScrollView:0x10068c570 )>

Set the NSUserDefault NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints to YES to have -[NSWindow visualizeConstraints:] automatically called when this happens.  And/or, break on objc_exception_throw to catch this in the debugger.

It seems like they are being created automatically.

This is my creation code (using arc) I'm subclassing NSView

-(void)addColumnsToTable{
    NSTableColumn *col = [[NSTableColumn alloc]initWithIdentifier:@"priority"];
    [col.headerCell setStringValue:@"priority"];
    [col setWidth:10];
    [col setMinWidth:1];
    [col setMaxWidth:10];
    [self.tableView addTableColumn:col];

   // col = [[NSTableColumn alloc]initWithIdentifier:@"name"];
   // [self.tableView addTableColumn:col];   
}


-(void)createTable{
    NSTableView *tableView = [[NSTableView alloc]initWithFrame:NSZeroRect];

    [tableView setDelegate:self];
    [tableView setDataSource:self];

    NSScrollView *scrollView = [[NSScrollView alloc]initWithFrame:self.bounds];
    [scrollView setBorderType:NSGrooveBorder];

    [self addSubview:scrollView];
    [scrollView setDocumentView:tableView];
    [scrollView setHasVerticalScroller:YES];
    [scrollView setAutohidesScrollers:YES];


    self.tableView = tableView;
    self.scrollView = scrollView;

    [self addColumnsToTable];

}

Here is where it is breaking:

-(void)setFrame:(NSRect)frameRect{
    [super setFrame:frameRect];
    [self.scrollView setFrame:self.bounds];

}

Is there a way to turn off these automatic constraints?


Solution

  • Got it, the problem is that automatic constraints are being created based on the view's automatic resize mask. To deactivate this behaviour:

    [scrollView setTranslatesAutoresizingMaskIntoConstraints:NO];
    

    where scrollView is a subview of NSView