如何在 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;

我不知道如何将fontSizebaselineAdjustment传递给

attributes 字典。

例如

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

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

【问题讨论】:

这些常量列在文档中,用于将 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 文本垂直居中或放置一些填充

查看 NSString drawInRect 将使用多少行的简单方法?

在drawInRect中绘制渐变层

drawAtPoint: 和 drawInRect: 模糊文本