Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to let NSTextField grow with the text in auto layout?

Auto layout in Lion should make it fairly simple to let a text field (and hence a label) grow with text it holds.

The text field is set to wrap in Interface Builder.

What is a simple and reliable way to do this?

like image 234
Monolo Avatar asked May 05 '12 16:05

Monolo


1 Answers

The method intrinsicContentSize in NSView returns what the view itself thinks of as its intrinsic content size.

NSTextField calculates this without considering the wraps property of its cell, so it will report the dimensions of the text if laid out in on a single line.

Hence, a custom subclass of NSTextField can override this method to return a better value, such as the one provided by the cell's cellSizeForBounds: method:

-(NSSize)intrinsicContentSize {     if ( ![self.cell wraps] ) {         return [super intrinsicContentSize];     }      NSRect frame = [self frame];      CGFloat width = frame.size.width;      // Make the frame very high, while keeping the width     frame.size.height = CGFLOAT_MAX;      // Calculate new height within the frame     // with practically infinite height.     CGFloat height = [self.cell cellSizeForBounds: frame].height;      return NSMakeSize(width, height); }  // you need to invalidate the layout on text change, else it wouldn't grow by changing the text - (void)textDidChange:(NSNotification *)notification {     [super textDidChange:notification];     [self invalidateIntrinsicContentSize]; } 
like image 130
Monolo Avatar answered Sep 18 '22 22:09

Monolo