2013-10-09 5 views
28

Я работаю над новой версией своего приложения и пытаюсь заменить устаревшие сообщения, но не могу пройти мимо этого.drawInRect: withAttributes vs drawInRect: withFont: lineBreakMode: выравнивание

Не могу понять, почему drawInRect:withAttributes не работает. Код отображается правильно, когда отправляется сообщение drawInRect:withFont:lineBreakMode:alignment, но не работает, когда отправляется drawInRect:withAttributes.

Я использую тот же прямоугольник и шрифт, и я уверен, что это тот же стиль текста. Константы просто позиционируют прямоугольник чуть ниже изображения, но я использую один и тот же прямоугольник для обоих вызовов, поэтому я уверен, что прямоугольник правильный.

(обратите внимание, что bs.name используется ниже, является объектом NSString)

 CGRect textRect = CGRectMake(fCol*kRVCiPadAlbumColumnWidth, 
            kRVCiPadAlbumColumnWidth-kRVCiPadTextLabelYOffset, 
            kRVCiPadAlbumColumnWidth, 
            kRVCiPadTextLabelHeight); 
     NSMutableParagraphStyle *textStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy]; 
     textStyle.lineBreakMode = NSLineBreakByWordWrapping; 
     textStyle.alignment = NSTextAlignmentCenter; 
     UIFont *textFont = [UIFont systemFontOfSize:16]; 

Это не работает (ничего не рисуется на экране), используя переменные сверху

 [bs.name drawInRect:textRect 
      withAttributes:@{NSFontAttributeName:textFont, 
           NSParagraphStyleAttributeName:textStyle}]; 

Это работает (строка рисуется правильно на экране), используя те же переменные сверху

 [bs.name drawInRect:textRect 
        withFont:textFont 
       lineBreakMode:NSLineBreakByWordWrapping 
        alignment:NSTextAlignmentCenter]; 

Любая помощь была бы замечательной. Благодарю.

+0

Что вы имеете в виду, говоря, что 'drawInRect: withAttributes:' не работает? –

+0

Очень хороший вопрос. Извините, я не уточнил. Строка, содержащаяся в bs.name, правильно рисуется на экране с помощью drawInRect: withFont: lineBreakMode: сообщение выравнивания, но не появляется при использовании сообщения drawInRect: withAttributes (ничего не нарисовано). –

ответ

28

Я сделал UIView с drawRect:, содержащий только код, который вы указали

- (void)drawRect:(CGRect)frame 
{ 
    NSMutableParagraphStyle *textStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy]; 
    textStyle.lineBreakMode = NSLineBreakByWordWrapping; 
    textStyle.alignment = NSTextAlignmentCenter; 
    UIFont *textFont = [UIFont systemFontOfSize:16]; 

    NSString *text = @"Lorem ipsum"; 

    // iOS 7 way 
    [text drawInRect:frame withAttributes:@{NSFontAttributeName:textFont, NSParagraphStyleAttributeName:textStyle}]; 

    // pre iOS 7 way 
    CGFloat margin = 16; 
    CGRect bottomFrame = CGRectMake(0, margin, frame.size.width, frame.size.height - margin); 
    [text drawInRect:bottomFrame withFont:textFont lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentCenter]; 
} 

Я не вижу никакой разницы между выходами этих двух методов. Может быть, проблема в другом месте вашего кода?

+0

Спасибо за вашу работу по предоставлению этого ответа. Мой код также выполняется из drawRect: на UIView. Я согласен, что это должно быть где-то в другом месте, но если я прокомментирую один или другой, один работает, другой - нет. Возможно, прямоугольник необходимо пересчитать по любой причине, отличной от iOS 7 (только для информации, iOS 7 - drawInRect: withAttributes). Я немного поработаю с прямоугольником. Еще раз спасибо. –

+0

Убедитесь, что 'CGRect' передан в оба метода одинаковыми. Вы также можете попробовать 1) изменить цвет текста, 2) нарисовать фон на вашем прямоугольнике, просто чтобы убедиться, что он расположен там, где вы хотите. Эти шаги довольно упрощены, но, возможно, они помогут найти, где проблема. –

+0

Я использую тот же самый код точно таким же способом (не два метода). Если вы замените drawRect: (старый) с помощью drawRect: (new) в точно таком же месте в коде, используя тот же самый прямоугольник, один работает, а другой нет. Я все еще в тупике. Если я найду что-нибудь, я отправлю. –

36

Чтобы задать цвет текста, вам необходимо передать NSForegroundColorAttributeName в качестве дополнительного параметра.

NSDictionary *dictionary = @{ NSFontAttributeName: self.font, 
           NSParagraphStyleAttributeName: paragraphStyle, 
           NSForegroundColorAttributeName: self.textColor}; 
Смежные вопросы