2015-01-16 1 views
1

Я пытаюсь создать PDF внутри своего приложения. Чтобы нарисовать строку, я вычисляю размер ограничивающего прямоугольника для этой строки, используя boundingRectWithSize, а затем рисую строку внутри прямоугольника этого размера.NSString drawInRect: withAttributes: не рисует текст с большей шириной, чем rect в iOS 7.0.3

Код отлично работает в 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]; 
} 

Я не могу понять, что может быть проблема. Пожалуйста помоги.

+0

ваш код может иметь ошибку в строке, которая начинается с 'CGRect TextRect = ...' – wcd

+0

Я отредактировал мой ответ. Посмотрите, работает ли он – wcd

ответ

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]; 
} 
+0

Я пробовал код, который вы предлагали, но он не работал. – Siddesh

+0

где этот код называется? Вы уверены, что графический контекст настроен правильно? Вы рисуете какой-то текст в изображение? Пожалуйста, предоставьте дополнительную справочную информацию, чтобы я мог вам помочь. Спасибо. @Siddesh – wcd

+0

Я в основном пытаюсь распечатать список адресов, которые могут быть многострочными. Я вызываю эту функцию в цикле for, вычисляя высоту каждого адреса и позиционируя следующий. Значения x и y, записанные в моем вопросе, являются произвольными значениями. Мой текущий код работает как ожидалось в iOS 7.1 и выше, но в одном из моих тестовых устройств (под управлением iOS 7.0.3) его строки без рисования, превышающие мою указанную ширину, 400 – Siddesh

Смежные вопросы