Auto Layout Constraints in NSScrollView

I create an NSTableView inside an NSScrollView programmatically, but when I try to set a frame in a scroll view, I get 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. 

They seem to be created automatically.

This is my creation code (using an arc). I will subclass 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]; } 

This is where it breaks:

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

Is there any way to turn off these automatic restrictions?

+4
source share
2 answers

Alas, the problem is that automatic restrictions are created based on automatic masking of the view. To disable this behavior:

 [scrollView setTranslatesAutoresizingMaskIntoConstraints:NO]; 

where scrollView is a subset of NSView

+7
source

I also got the same problem when setting up the NSScrollView frame NSScrollView method of the DrawRect subclass. The above decision to set TranslatesAutoresizingMaskIntoConstraints to NO eliminates the exception. But in my situation I have a dynamic window. Indeed, my tableview did not match the new frame size, which I compute and adjust to NSScrollView more.

After working for some time, I finally came up with the right solution. It seems that the problem was not with the NSScrollView autosave NSScrollView , but setting up the AutoresizesSubviews my NSView subclass is the right solution for a dynamic user view.

 - (void)awakeFromNib { [super awakeFromNib]; [self setAutoresizesSubviews:NO]; // <- Here is the solution // … } - (void)drawRect:(NSRect)dirtyRect { [super drawRect:dirtyRect]; // From DirtyRect (dimensions of the my subclass NSView) // Calculate the rectangle allowable for MyScrollView // and setting local NSRect mRect.. [MyScrollView setFrame:mRect]; // no more 'exception' here } 

I also have to programmatically create other subclasses of NSView that also needed the NSScrollView and frame settings. Since these objects do not have an awakeFromNib method ... just set it elsewhere & hellip; as in the Init method of a subclass of NSView .

 - (id)init:(NSInteger)aSpecialTag { [self setAutoresizesSubviews:NO]; // <- Here is the solution _mTag = aSpecialTag; // … } 
0
source

Source: https://habr.com/ru/post/1437476/


All Articles