On Jun 30, 2015, at 11:56 AM, Jonathan Guy <[email protected]> wrote:

> Im trying to fix a problem with dynamic row heights with auto layout and 
> bindings which was working fine in an older build of Xcode but which now no 
> longer works. So my new attempt for the most part works but about 30% of my 
> row heights are not correctly calculated. Basically I create a reference 
> NSTableCellView, set my model object as the objectValue which then updates 
> the bindings, set the frame width of the reference cell to the column width 
> then work out the height from there by setting preferredMaxLayoutWidth on the 
> wrapping text field. Here's the code to do the calculation
> 
> 
> 1     - (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row
> 2     {
> 3         static NSTableCellView *cellView = nil;
> 4
> 5         if (cellView == nil) {
> 6             NSDictionary *nibs = [tableView registeredNibsByIdentifier];
> 7             NSNib *nib = nibs[@"MainCellView"];
> 8             NSArray *topLevelObjects = nil;
> 9
> 10            [nib instantiateWithOwner:nil topLevelObjects:&topLevelObjects];
> 11
> 12            for (id object in topLevelObjects) {
> 13                if ([object isKindOfClass:[NSTableCellView class]]) {
> 14                    cellView = object;
> 15                    break;
> 16                }
> 17            }
> 18        }
> 19
> 20        LogEntryNode *node = self.logEntryNodes[row];
> 21
> 22        cellView.objectValue = node;
> 23
> 24        NSTableColumn *tc = tableView.tableColumns[0];

You should always look up table columns by identifier, not order in the array.

> 25        NSSize size = NSMakeSize(tc.width, 43.0);
> 26
> 27        [cellView setFrameSize:size];

Does the cell view have translatesAutoresizingMaskIntoConstraints turned on?  
If not, then setting the frame size is useless.  You would have to set a width 
constraint.

> 28        [cellView setNeedsLayout:YES];
> 29        [cellView layoutSubtreeIfNeeded];
> 30
> 31        cellView.textField.preferredMaxLayoutWidth = 
> cellView.textField.frame.size.width;
> 32
> 33        CGFloat height = cellView.textField.intrinsicContentSize.height;
> 34        CGFloat padding = cellView.frame.size.height - 
> cellView.textField.frame.size.height;
> 35         
> 36        height += padding;  

The text field's intrinsic height is in terms of the alignment rect, not the 
frame rect.  You should have the text field convert a rect of the appropriate 
size from alignment rect to frame rect (using -frameForAlignmentRect:) and get 
the height of that.  Furthermore, what constraints are there within your cell 
view between the text field and the cell view?  What reason to do you have to 
believe that that padding, computed from when the text field had no (or an 
incorrect) preferredMaxLayoutWidth, is appropriate for when it has the correct 
one?

Can you make auto layout determine a height for a container view so that, after 
setting preferredMaxLayoutWidth, you'd simply do another layout pass and take a 
container's frame height as the row height?

Regards,
Ken


_______________________________________________

Cocoa-dev mailing list ([email protected])

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to