Hi

I needed to do this for my pdf builder  implementation:

Using the NSLayoutManager directly gives the best level of control.
 
https://github.com/ThesaurusSoftware/PDFPageBuilder/blob/master/PDFPageBuilder/TSPageTextItem.m#L95

    NSRect boundingRect = self.containerRect;
    
    // if no rect height defined then use default
    BOOL containerHasExplicitHeight = YES;
    if (boundingRect.size.height == 0) {
        boundingRect.size.height = self.pageHeight - 
self.containerRect.origin.y ;
        containerHasExplicitHeight = NO;
    }
    
    // allocate text container and layout manager
    NSTextContainer *textContainer = [[NSTextContainer alloc] 
initWithContainerSize:boundingRect.size];
    textContainer.lineFragmentPadding = 0;  // defaults to non zero
    
    NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
    [layoutManager addTextContainer:textContainer];
    layoutManager.usesFontLeading = YES;
    
    // allocate text storage and assign layout manager
    self.textStorage = [[NSTextStorage alloc] 
initWithAttributedString:self.attributedString];
    [self.textStorage addLayoutManager:layoutManager];
    
    // do glyph layout
    // NOTE: cannot quite get glyphRangeForBoundingRect configured correctly 
here
    //self.glyphRange = [layoutManager glyphRangeForBoundingRect:boundingRect 
inTextContainer:textContainer];
    self.glyphRange = [layoutManager glyphRangeForTextContainer:textContainer];
    
    // get rect used for actual glyph layout
    self.usedTextRect = [layoutManager usedRectForTextContainer:textContainer];

Jonathan

> On 3 Mar 2017, at 13:28, Igor Ranieri <i...@elland.me> wrote:
> 
> Hi Peter.
> 
> 
> Have you tried also passing `usesLineFragmentOrigin` as one of the options? 
> It works here.
> 
> Here’s some code I’m currently using to achieve a similar effect:
> 
> let sizeLimit = CGSize(width: 80.0, height: CGFloat.greatestFiniteMagnitude)
> let size = attrString.boundingRect(with: sizeLimit, options: 
> [.usesLineFragmentOrigin, .usesFontLeading], context: nil).integral.size
> 
> And it returns the expected size.
> 
> 
> best,
> elland
> 
> 
>> On 3. Mar 2017, at 14:18, Peter Hudson <peter.hud...@me.com> wrote:
>> 
>> Hi All
>> 
>> I have done the following to try to determine the rect required to draw an 
>> attributed string( and thus the height of a row in a table view  - on MacOS 
>> ) 
>> 
>> I am trying to constrain my column width to 60 - and let the possible height 
>> of the row be a max of 1000.
>> 
>> 
>> let aString = anAttributedString
>> let constrainedSize = NSMakeSize(60.0, 1000.0)
>> let optns = NSStringDrawingOptions.usesFontLeading
>> let cntxt = NSStringDrawingContext()
>> cntxt.minimumScaleFactor = 1.0
>> 
>> let aRect = aString?.boundingRect(with: constrainedSize, options: optns, 
>> context: cntxt)
>> 
>> 
>> 
>> After the call to boundingRect,  aRect has its width set to 60 and its 
>> height set to 18.  
>> 
>> This is not however correct for the contents of the attributed string - I 
>> would expect the height to be at least 200 or so with the width constrained 
>> to 60.
>> 
>> Any help gratefully received.
>> 
>> Peter
>> 
>> 
>> 
>> _______________________________________________
>> 
>> 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/igor%40elland.me
>> 
>> This email sent to i...@elland.me
> 
> 
> _______________________________________________
> 
> 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/lists%40mugginsoft.com
> 
> This email sent to li...@mugginsoft.com


_______________________________________________

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