On Mar 17, 2017, at 01:45 , Daryle Walker <dary...@mac.com> wrote:
> 
> Besides those who intentionally want truncating behavior, wouldn’t “expand to 
> show all text” be the expected default? The current default isn’t friendly to 
> end users.

I’m a bit puzzled about what you’re expecting. You asked about determining row 
heights in a table. In that case, the current default is to use fixed row 
heights, and that is the expected default for table rows, regardless of the 
kind of content in them.

So, you’re talking about text in isolation, which is a different issue.

> Unfortunately, you didn’t provide your Stack Overflow sources.

Because it doesn’t provide a clean working solution, so I was trying to save 
you the work of reinventing that particular wheel.

> I made my first attempt after reading 
> <http://stackoverflow.com/a/32332743/1010226 
> <http://stackoverflow.com/a/32332743/1010226>>:
> 
>>     // Increase the row height to fit all the text (instead of the first 
>> line).
>>     func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> 
>> CGFloat {
>>         precondition(tableView === self.headerTableView)
>> 
>>         var height = tableView.rowHeight
>>         let nameColumn = tableView.tableColumn(withIdentifier: 
>> Names.nameColumnIdentifier)!
>>         let bodyColumn = tableView.tableColumn(withIdentifier: 
>> Names.bodyColumnIdentifier)!
>>         let field = (self.headerArrayController.arrangedObjects as! 
>> NSArray).object(at: row) as! RawHeaderField
>>         let attributes = [NSFontAttributeName: NSFont.systemFont(ofSize: 0)]
>>         let nameString = NSAttributedString(string: field.name, attributes: 
>> attributes)
>>         let bodyString = NSAttributedString(string: field.body, attributes: 
>> attributes)
>>         for (string, column) in [(nameString, nameColumn), (bodyString, 
>> bodyColumn)] {
>>             let frame = NSRect(x: 0.0, y: 0.0, width: column.width, height: 
>> .greatestFiniteMagnitude)
>>             let view = NSTextView(frame: frame)
>>             view.textStorage?.setAttributedString(string)
>>             view.isHorizontallyResizable = false
>>             view.sizeToFit()
>>             height = max(height, view.frame.size.height /*+ 20*/)
>>         }
>> 
>>         return height
>>     }

This isn’t what you want, for two entirely separate reasons.

1. Assuming you’re using view-based table views (and if you’re not, you really 
should be), then you don’t want the height of the text, you want the height of 
the cell (NSTableCellView) that contains your text in a subview. The whole 
point is that you leverage autolayout to get the NSTableCellView to compute the 
text height for you. Furthermore, the text is placed *within* the cell, so the 
height of the NSTableCellView may be bigger than the height of the text, or (in 
general) the cell might contain other views that need to be taken into account.

2. You shouldn’t be using a NSTextView, but a NSTextField. A text view 
typically is placed within a fixed height frame, wrapped in a scroll view, so 
the concept of an intrinsic height is problematic. What is your actual cell 
structure, text view or text field?

> But it only establishes the row heights once, at start but never after any 
> resizes (column or whole-table).

As I said before, you have to watch for column width changes and recalculate 
your heights accordingly. There is no automatic way of handling variable 
heights on the Mac that matches the way it can be done on iOS.

> It still is short on some long lines. (Is it because I use word-wrap, instead 
> of by character, for that column?) Also, I hard-coded the font to match what 
> the table has. Is there any way to read what the cell template has? 
> (“NSTableView.view(something)” can generate a view for a given row and 
> column, but Apple specifically barred it (with an assert/exception) during 
> this method.)

Using autolayout on the cell as a whole will avoid all of these issues for the 
text in particular. You’ll get the metrics as implied by the way your text 
field is configured.

_______________________________________________

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