How to use drawInRect:withAttributes: instead of drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment: in iOS 7

后端 未结 2 802
旧巷少年郎
旧巷少年郎 2021-01-31 08:15

This method is deprecated in iOS 7.0:

drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:

Now use drawInRect:withAtt

相关标签:
2条回答
  • 2021-01-31 09:00

    You can use NSDictionary and apply attributes like this:

    NSFont *font = [NSFont fontWithName:@"Palatino-Roman" size:14.0];
    
    NSDictionary *attrsDictionary =
    
    [NSDictionary dictionaryWithObjectsAndKeys:
                                  font, NSFontAttributeName,
                                  [NSNumber numberWithFloat:1.0], NSBaselineOffsetAttributeName, nil];
    

    Use attrsDictionary as argument.

    Refer: Attributed String Programming Guide

    Refer: Standard Attributes

    SWIFT: IN String drawInRect is not available but we can use NSString instead:

    let font = UIFont(name: "Palatino-Roman", size: 14.0)
    let baselineAdjust = 1.0
    let attrsDictionary =  [NSFontAttributeName:font, NSBaselineOffsetAttributeName:baselineAdjust] as [NSObject : AnyObject]
    let str:NSString = "Hello World"
    str.drawInRect(CGRectZero, withAttributes: attrsDictionary)
    
    0 讨论(0)
  • 2021-01-31 09:01

    It is a little more complicated than before and you cannot use a minimum font size, but have to use minimum font scale factor. There is also a bug in the iOS SDK, which breaks it for most use cases (see notes at the bottom). Here is what you have to do:

    // Create text attributes
    NSDictionary *textAttributes = @{NSFontAttributeName: [UIFont systemFontOfSize:18.0]};
    
    // Create string drawing context
    NSStringDrawingContext *drawingContext = [[NSStringDrawingContext alloc] init];
    drawingContext.minimumScaleFactor = 0.5; // Half the font size
    
    CGRect drawRect = CGRectMake(0.0, 0.0, 200.0, 100.0);
    [string drawWithRect:drawRect
                 options:NSStringDrawingUsesLineFragmentOrigin
              attributes:textAttributes
                 context:drawingContext];
    

    Notes:

    • There seems to be a bug in the iOS 7 SDK at least up to version 7.0.3: If you specify a custom font in the attributes, the miniumScaleFactor is ignored. If you pass nil for the attributes, the text is scaled correctly.

    • The NSStringDrawingUsesLineFragmentOrigin option is important. It tells the text drawing system, that the drawing rect's origin should be at the top left corner.

    • There is no way to set the baselineAdjustment using the new method. You would have to do that yourself by calling boundingRectWithSize:options:attributes:context: first and then adjusting the rect before you pass it to drawWithRect:options:attributes:context.

    0 讨论(0)
提交回复
热议问题