40

此方法在 iOS 7.0 中已弃用:

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

现在drawInRect:withAttributes:改用。

我找不到fontSize 和baselineAdjustment 的attributeName。

编辑

感谢@Puneet 的回答。

实际上,我的意思是如果没有这些密钥,如何在 iOS 7 中实现此方法?

像下面的方法:

+ (CGSize)drawWithString:(NSString *)string atPoint:(CGPoint)point forWidth:(CGFloat)width withFont:(UIFont *)font fontSize:(CGFloat)fontSize
           lineBreakMode:(IBLLineBreakMode)lineBreakMode
      baselineAdjustment:(UIBaselineAdjustment)baselineAdjustment {
    if (iOS7) {
        CGRect rect = CGRectMake(point.x, point.y, width, CGFLOAT_MAX);

        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        paragraphStyle.lineBreakMode = lineBreakMode;

        NSDictionary *attributes = @{NSFontAttributeName: font, NSParagraphStyleAttributeName: paragraphStyle};

        [string drawInRect:rect withAttributes:attributes];

        size = CGSizeZero;
    }
    else {
        size = [string drawAtPoint:point forWidth:width withFont:font fontSize:fontSize lineBreakMode:lineBreakMode baselineAdjustment:baselineAdjustment];
    }
    return size;
}

我不知道如何通过fontSizebaselineAdjustment

attributes字典。

例如

NSBaselineOffsetAttributeNamekey 应该传递NSNumer给它,但是baselineAdjustmentis Enum

难道没有其他方法可以传递这两个变量吗?

4

2 回答 2

38

您可以NSDictionary像这样使用和应用属性:

NSFont *font = [NSFont fontWithName:@"Palatino-Roman" size:14.0];

NSDictionary *attrsDictionary =

[NSDictionary dictionaryWithObjectsAndKeys:
                              font, NSFontAttributeName,
                              [NSNumber numberWithFloat:1.0], NSBaselineOffsetAttributeName, nil];

attrsDictionary用作论据。

参考: 属性字符串编程指南

参考:标准属性

SWIFT: IN String drawInRect 不可用,但我们可以使用NSString代替:

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)
于 2013-10-18T06:08:40.430 回答
34

它比以前复杂一点,您不能使用最小字体大小,但必须使用最小字体比例因子。iOS SDK 中还有一个错误,它在大多数用例中都会破坏它(请参阅底部的注释)。这是你必须做的:

// 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];

笔记:

  • iOS 7 SDK 至少到 7.0.3 版似乎存在一个错误:如果您在属性中指定自定义字体,则忽略 miniumScaleFactor。如果您为属性传递 nil,则文本将正确缩放。

  • NSStringDrawingUsesLineFragmentOrigin选项很重要。它告诉文本绘图系统,绘图矩形的原点应该在左上角。

  • 无法使用新方法设置baselineAdjustment。您必须自己执行此操作,方法是boundingRectWithSize:options:attributes:context:先调用然后调整 rect,然后再将其传递给drawWithRect:options:attributes:context.

于 2013-11-05T11:50:37.760 回答