Many thanks for this detailed help Jonathan.  
I’ll work my way through it !

Peter



> On 4 Mar 2017, at 09:54, Jonathan Mitchell <li...@mugginsoft.com> wrote:
> 
>> I’m still not out of the wood yet though.
> 
> 
> Sorry. I should have provided more details.
> 
> What I do to support table cell view wrapping is this. However, I have to 
> support back to 10.9 so it may be possible to use some of the newer auto 
> NSTextField line wrapping stuff.
> 
> 1. Create a nib containing a wrapping cell view and associate it with a 
> column that we want to wrap the content of. View based tableviews use Auto 
> Layout for interior layout but in IB it doesn’t generally add and constrains 
> to the default table cell views. So make a BPWrappingTableCellView nib that 
> contains an NSTextField configured to wrap and constrained to the width and 
> height of the cell.
> 
>    columnCellNib = [[NSNib alloc] initWithNibNamed:@"BPWrappingTableCellView" 
> bundle:nil];
>    [self.tableView registerNib:columnCellNib forIdentifier:@"action”];
> 
> 2. Now the height of a row in the tableview must equal the height of the 
> tallest cell in the row. There is a NSTableViewDelegate call for this. IN 
> this example I have only one column that I need to wrap. If you have more you 
> will need to find out which column has the tallest content.
> 
> - (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row
> {
>    // calculate height of row based on height of cell view in variable height 
> column
>    id obj = self.arrayController.arrangedObjects[row];
>    CGFloat height = [tableView bp_heightOfRowForString:obj.description 
> variableHeightColumnIdentifier:@"action"];
>    return height;
> }
> 
> 3. Calculate height of cell using a worker cell. This is an NSTableView 
> category method.
> 
> #pragma mark -
> #pragma mark Row height support
> 
> - (CGFloat)bp_heightOfRowForString:(NSString *)text 
> variableHeightColumnIdentifier:(NSString *)identifier
> {
>    /*
> 
>     Calculate height of row to accomodate wrapping text field in the 
> description column.
>     On 10.11 it might be possible to just use the fields Automatic setting.
> 
>     
> http://stackoverflow.com/questions/7504546/view-based-nstableview-with-rows-that-have-dynamic-heights
> 
>     */
>    // we use a layout worker cell for height calcs.
>    if (!self.layoutCellView) {
>        self.layoutCellView = [self makeViewWithIdentifier:identifier 
> owner:nil];
>    }
> 
>    // reset size
>    CGFloat width = [self tableColumnWithIdentifier:identifier].width;
>    [self.layoutCellView setFrameSize:NSMakeSize(width, 10)];
> 
>    // set the cell text
>    self.layoutCellView.textField.stringValue = text;
> 
>    // layout to calculate size
>    self.layoutCellView.textField.preferredMaxLayoutWidth = width - 
> self.layoutCellView.textField.frame.origin.x - 10;
>    [self.layoutCellView layoutSubtreeIfNeeded];
>    CGFloat height = self.layoutCellView.frame.size.height;
> 
>    if (height < 30) height = 30;
>    if (height > 150) height = 150;
> 
>    return height;
> }
> 
> 4. Deal with column resizing:
> 
> - (void)tableViewColumnDidResize:(NSNotification *)aNotification
> {
>    // notify table view of row height change if variable height column width 
> changes
>    NSTableColumn *tableColumn = aNotification.userInfo[@"NSTableColumn"];
>    NSTableView *tableView = tableColumn.tableView;
>    [tableView bp_columnDidResize:tableColumn 
> variableHeightColumnIdentifiers:@[@"action"]];
> }
> 
> Another NSTableView category method.
> - (void)bp_columnDidResize:(NSTableColumn *)tableColumn 
> variableHeightColumnIdentifiers:(NSArray *)columnIds
> {
>    /*
> 
>     Trigger row height recalculation when change table column width
> 
>     */
>    if (self.numberOfRows > 0 && [columnIds 
> containsObject:tableColumn.identifier]) {
>         NSIndexSet *rowIndexSet = [NSIndexSet 
> indexSetWithIndexesInRange:NSMakeRange(0, self.numberOfRows)];
>        [NSAnimationContext beginGrouping];
>        [[NSAnimationContext currentContext] setDuration:0];
>        [self noteHeightOfRowsWithIndexesChanged:rowIndexSet];
>        [NSAnimationContext endGrouping];
>    }
> }
> 
> HTH
> 
> J
> 


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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 arch...@mail-archive.com

Reply via email to