如何在 iOS 7 中使用 drawInRect:withAttributes: 而不是 drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:ba
Posted
技术标签:
【中文标题】如何在 iOS 7 中使用 drawInRect:withAttributes: 而不是 drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:【英文标题】:How to use drawInRect:withAttributes: instead of drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment: in iOS 7 【发布时间】:2013-10-18 06:02:19 【问题描述】:此方法在 ios 7.0 中已弃用:
drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:
现在改用drawInRect:withAttributes:
。
我找不到fontSize 和baselineAdjustment 的attributeName。
编辑
感谢@Puneet 的回答。
其实我的意思是如果没有这些key,在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;
我不知道如何将fontSize
和baselineAdjustment
传递给
attributes
字典。
例如
NSBaselineOffsetAttributeName
键应该传递一个NSNumer
给它,但baselineAdjustment
是Enum
。
难道没有其他方法可以传递这两个变量吗?
【问题讨论】:
这些常量列在文档中,用于将 UIKit 添加到NSAttributedString
。
谢谢,这个我也知道,但是我不知道如何在iOS 7中实现这个方法。
【参考方案1】:
您可以使用NSDictionary
并应用如下属性:
NSFont *font = [NSFont fontWithName:@"Palatino-Roman" size:14.0];
NSDictionary *attrsDictionary =
[NSDictionary dictionaryWithObjectsAndKeys:
font, NSFontAttributeName,
[NSNumber numberWithFloat:1.0], NSBaselineOffsetAttributeName, nil];
使用attrsDictionary
作为参数。
参考:Attributed String Programming Guide
参考:Standard Attributes
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)
【讨论】:
请再次阅读问题。 OP 正在寻找两个特定的属性键。 如何使字符串多行?【参考方案2】:它比以前复杂一点,你不能使用最小字体大小,但必须使用最小字体比例因子。 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];
注意事项:
至少在 7.0.3 版之前的 iOS 7 SDK 中似乎存在一个错误:如果您在属性中指定自定义字体,则会忽略 miniumScaleFactor。如果您为属性传递 nil,则文本将正确缩放。
NSStringDrawingUsesLineFragmentOrigin
选项很重要。它告诉文本绘图系统,绘图矩形的原点应该在左上角。
无法使用新方法设置baselineAdjustment。您必须先调用boundingRectWithSize:options:attributes:context:
,然后在将其传递给drawWithRect:options:attributes:context
之前调整矩形。
【讨论】:
更好的答案。快速注意,您可以使用 NSBaselineOffsetAttributeName 调整基线,但只有负值才能将文本向下移动。向上移动文本的正值被限制为零。以上是关于如何在 iOS 7 中使用 drawInRect:withAttributes: 而不是 drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:ba的主要内容,如果未能解决你的问题,请参考以下文章
UITableViewCell drawInRect iOS7
使用 drawInRect:withAttributes 对齐文本:
drawInRect: withAttributes 文本垂直居中或放置一些填充