Im a little late to the game - but I have been trying to figure out a way that works to find the bounding box that will fit around an attributed string to make a focus ring like editing a file in Finder does. everything I had tried failed when there are spaces at the end of the string or multiple spaces inside the string. boundingRectWithSize
fails miserably for this as well as CTFramesetterCreateWithAttributedString
.
Using a NSLayoutManager
the following code seems to do the trick in all the cases I have found so far and returns a rect that perfectly bounds the string. Bonus: if you select the text the edges of the selection go right up to the bounds of the rect returned. The code below uses the layoutManager from a NSTextView
.
NSLayoutManager* layout = [self layoutManager];
NSTextContainer* container = [self textContainer];
CGRect focusRingFrame = [layout boundingRectForGlyphRange:NSMakeRange(0, [[self textStorage] length]) inTextContainer:container];