iOS7&x27;s对NSString的弃用';s drawAtPoint:forWidth:withFont:minFontSize:actualFontSize:lineBreakMode:baselineAdjustment:

iOS7&x27;s对NSString的弃用';s drawAtPoint:forWidth:withFont:minFontSize:actualFontSize:lineBreakMode:baselineAdjustment:,ios,objective-c,nsstring,ios7,deprecated,Ios,Objective C,Nsstring,Ios7,Deprecated,在iOS7的发行版中,以下功能已被弃用: drawAtPoint:forWidth:withFont:minFontSize:actualFontSize:lineBreakMode:baselineAdjustment: 在苹果的文档中,它建议使用 drawInRect:withAttributes: 我使用此函数的原因是因为minFontSize参数,它允许我在矩形中绘制字符串 如果文本不适合,它将首先将文本大小缩小为minFontSize,然后如果文本不适合,它将截断文本 到目前为止,

在iOS7的发行版中,以下功能已被弃用:

drawAtPoint:forWidth:withFont:minFontSize:actualFontSize:lineBreakMode:baselineAdjustment:
在苹果的文档中,它建议使用

drawInRect:withAttributes:
我使用此函数的原因是因为
minFontSize
参数,它允许我在矩形中绘制字符串

如果文本不适合,它将首先将文本大小缩小为
minFontSize
,然后如果文本不适合,它将截断文本

到目前为止,我无法使用
drawInRect:withAttributes:
来完成此任务


我可以使用哪个键来确定minFontSize的等价项?

只需使用该键和属性创建一个NS字典即可

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: @"15", @"minFontSize", @"value2", @"key2", nil];
//in key2 and value2 you could set any other of the attributes included in the first method
[yourString drawInRect:rect withAttributes:attributes];

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

// 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中似乎存在一个bug:如果在属性中指定自定义字体,则忽略miniumScaleFactor。如果属性传递nil,则文本将正确缩放

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

  • 无法使用新方法设置baselineAdjustment。您必须先调用
    boundingRectWithSize:options:attributes:context:
    ,然后调整rect,然后再将其传递给
    drawWithRect:options:attributes:context


在谷歌搜索了很长一段时间后,我没有找到一个在iOS7下工作的解决方案

现在我使用下面的解决方法,因为我知道它非常难看

我在内存中渲染一个UILabel,截图并绘制它

UILabel能够正确收缩文本

也许有人觉得它有用

UILabel *myLabel = [[UILabel alloc] initWithFrame:myLabelFrame];
myLabel.font = [UIFont fontWithName:@"HelveticaNeue-BoldItalic" size:16];
myLabel.text = @"Some text that is too long";
myLabel.minimumScaleFactor = 0.5;
myLabel.adjustsFontSizeToFitWidth = YES;
myLabel.backgroundColor = [UIColor clearColor];

UIGraphicsBeginImageContextWithOptions(myLabelFrame.size, NO, 0.0f);
[[myLabel layer] renderInContext:UIGraphicsGetCurrentContext()];
UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[screenshot drawInRect:myLabel.frame];

我用以下方法来解决我的问题。 使用以下代码,您可以在X、Y位置绘制点、设置字体、字体大小和字体颜色

[字符串drawAtPoint:CGPointMake(X,Y)
WithAttributeName:@{NSFontAttributeName:[UIFont fontWithName:@“Helvetica Bold”大小:18],NSForegroundColorAttributeName:[UIColourWithRed:199.0f/255.0f绿色:0.0f/255.0f蓝色:54.0f/255.0f alpha:1.0f]

将minFontSize添加为一个键并不会真正改变任何事情。是的,对不起,我没有正确阅读您的问题,我在文档中找不到任何与minFontSize完全相同的键,但是使用此键可能会起作用,“NSStrokeWidthAttributeName”,希望它能有所帮助根据文档,您的答案是正确的。然而,正如您所指出的,似乎存在一个bug,这一点正在被忽略。我没有尝试您将属性保留为零的建议,因为我确实需要传入一些属性,否则返回的大小将不正确。我认为这个答案是正确的。非常感谢。为这个答案添加一些额外的上下文,以帮助人们理解为什么这是一个好答案,而不仅仅是发布原始代码。