如何使用drawInRect:withAttributes:而不是drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:in iOS 7

iOS 7.0中不推荐使用此方法:

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

现在使用drawInRect:withAttributes:来代替。

我无法findfontSize和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字典。

例如

NSBaselineOffsetAttributeName键应该传递一个NSNumer ,但是baselineAdjustmentEnum

没有其他办法可以传递这两个variables吗?

你可以使用NSDictionary并应用这样的属性:

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

使用attrsDictionary作为参数。

请参阅:“ 属性string编程指南”

请参阅: 标准属性

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) 

这是比以前更复杂一点,你不能使用最小的字体大小,但必须使用最小的字体比例因子。 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中似乎存在一个错误,至less到版本7.0.3:如果您在属性中指定自定义字体,则miniumScaleFactor将被忽略。 如果您通过零的属性,文本正确缩放。

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

  • 使用新方法无法设置基线调整。 你必须自己调用boundingRectWithSize:options:attributes:context: first,然后在将其传递给drawWithRect:options:attributes:context之前调整矩形。