1

我正在尝试在我的应用程序中生成一个 pdf。要绘制一个字符串,我正在使用 boundingRectWithSize 计算该字符串的边界矩形的大小,然后在该大小的矩形内绘制字符串。

该代码在 iOS 7.1 及更高版本中运行良好,但在 iOS 7.0.3 中,如果文本的宽度大于矩形的宽度 (400),则根本不会绘制文本。根据 Apple 的文档,如果字符串不适合矩形,则应该将字符串换行并剪掉,这在 iOS 7.1 及更高版本中发生,但在 iOS 7.0.3 中没有。

这是我的代码片段:

-(void)drawText:(NSString *)string
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);

    NSDictionary *attrsDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
 myFontForContentBold, NSFontAttributeName,
 [NSNumber numberWithFloat:1.0], NSBaselineOffsetAttributeName, nil];

    CGRect textRect = [string boundingRectWithSize:CGSizeMake(400, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:attributes context:nil]
textRect = CGRectMake(130, 80, 400, textRect.size.height);

    [string drawInRect:textRect withAttributes:attrsDictionary];
}

我无法弄清楚问题可能是什么。请帮忙。

4

1 回答 1

1

试试这个:

-(void)drawText:(NSString *)string {
// this method must be called after a valid graphic context 
// is configured, it can be called in drawRect:, or a bitmap or pdf context is configured.
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);

    NSDictionary *attrsDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                     myFontForContentBold, NSFontAttributeName,
                                     [NSNumber numberWithFloat:1.0], NSBaselineOffsetAttributeName, nil];
    NSAttributedString *richText = [[NSAttributedString alloc] initWithString:string attributes:attrsDictionary];

    CGRect textRect = [richText boundingRectWithSize:CGSizeMake(400, CGFLOAT_MAX)
                                      options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                                      context:nil];

    textRect = CGRectMake(130, 80, 400, textRect.size.height);

    [richText drawInRect:textRect];
}

如果您需要绘制大量文本,请考虑Text Kit.

Text Kit方法:

- (void)drawAddressList:(NSArray *)list atPoint:(CGPoint)point {
    NSTextStorage *textStorage = [[NSTextStorage alloc] init];
    NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
    NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:CGSizeMake(400.0f, FLT_MAX)];
    [textStorage addLayoutManager:layoutManager];
    [layoutManager addTextContainer:textContainer];
    textContainer.lineFragmentPadding = 0.0f;

    NSDictionary *attributes = @{NSFontAttributeName:[UIFont preferredFontForTextStyle:UIFontTextStyleBody]};
    // it's a simple attributes for illustration
    for (NSString *address in list) {
        NSString *buffer = [NSString stringWithFormat:@"%@\n", address];
        [textStorage appendAttributedString:[[NSAttributedString alloc] initWithString:buffer attributes:attributes]];
    }

    [layoutManager ensureLayoutForTextContainer:textContainer];
    CGRect rect = [layoutManager usedRectForTextContainer:textContainer];
    rect.size.width = 400.0f;
    rect.size.height = ceilf(rect.size.height);
    rect.origin = point; // this is the frame needed to draw the address list

    [layoutManager drawGlyphsForGlyphRange:NSMakeRange(0, textStorage.length) atPoint:point];
}
于 2015-01-16T09:26:02.233 回答