— 
Daryle Walker
Mac, Internet, and Video Game Junkie
darylew AT mac DOT com 

> On Mar 17, 2017, at 2:24 PM, Quincey Morris 
> <quinceymor...@rivergatesoftware.com> wrote:
> 
> On Mar 17, 2017, at 01:45 , Daryle Walker <dary...@mac.com 
> <mailto:dary...@mac.com>> wrote:
>> 
>> 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?

It’s whatever NSTableCellView uses as a default, so… NSTextField.

…

I just tried something from a recent post by Jeremy Hughes:

//=====
class WrappingTextField: NSTextField {

    override var intrinsicContentSize: NSSize {
        guard let cell = self.cell, cell.wraps else { return 
super.intrinsicContentSize }

        self.validateEditing()
        return cell.cellSize(forBounds: NSRect(x: 0, y: 0, width: 
self.bounds.width, height: .greatestFiniteMagnitude))
    }

    override func textDidChange(_ notification: Notification) {
        super.textDidChange(notification)
        self.invalidateIntrinsicContentSize()
    }

}

//=====

I put this class as the table-cell’s type and took out the table delegate but 
kept the constraints of the text field to match those of the cell. No change 
(so far). I did debug printouts to the Xcode console, and there are changes. 
All the sizes from “super" are “(-1.0, 17.0)”, but the new sizes vary in widths 
and height. The table isn’t using the new values, though.


>> 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