Текст UILabel пикселируется, когда renderInContext использует CGContextDrawImage - PullRequest
1 голос
/ 05 ноября 2011

Я использую CoreText на iPhone, чтобы получить курсивный текст в UIScrollView.CoreText на iPhone не поддерживает изображения.Поэтому я советую CoreText выделить некоторое пространство для изображения, а затем использовать CGContextDrawImage, чтобы нарисовать изображение, blendedImage, в прямоугольнике 300 на 120, что составляет 2,5.Созданное изображение, представляющее собой изображение blendedImage в приведенном ниже коде, имеет такой же коэффициент размера, что и 175/70 = 2,5.Поскольку изображение, blendedImage, которое я создаю, содержит текст, который я также хочу переносить по словам, я создаю изображение с помощью renderInContext для UILabels, которые находятся в изображении.Проблема в том, что текст в UILabels размыт и пикселизирован.Кто-нибудь знает, как я могу это исправить?

Вот код:

CGRect dccFrame                      = CGRectIntegral(CGRectMake(0, 60, 70, 72));  // 20, 60, 100, 72
UILabel *dccLabel                    = [[UILabel alloc] initWithFrame:CGRectIntegral(dccFrame)];
dccLabel.backgroundColor             = [UIColor clearColor];
dccLabel.numberOfLines               = 0;
dccLabel.lineBreakMode               = UILineBreakModeWordWrap;
NSString *titledccString             = self.dccString;
dccLabel.textColor                   = [UIColor blackColor];
dccLabel.font                        = [UIFont fontWithName:@"Arial-BoldMT" size:7];
[dccLabel setText:titledccString];
[dccLabel sizeToFit];

CGSize newSize  = CGSizeMake(176, 70);  

UIGraphicsBeginImageContextWithOptions(newSize, NO, [UIScreen mainScreen].scale);
CGContextRef gc = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(gc, 1, 1, 1, 1);
CGContextSetShouldSmoothFonts(gc, YES);
CGContextSetAllowsAntialiasing(gc, YES);
CGContextSetShouldAntialias(gc, YES);
UIGraphicsPushContext(gc);

CGAffineTransform trf1       = CGAffineTransformMakeTranslation(0, 0);      
CGContextSaveGState(gc);
CGContextConcatCTM(gc, trf1);               
[[UIImage imageNamed: imageString] drawInRect:CGRectIntegral(CGRectMake(70, 0, 46, 60))];  
CGContextRestoreGState(gc);
UIGraphicsPopContext();

CGAffineTransform trf3 = CGAffineTransformMakeTranslation(0, 30);       
CGContextSaveGState(gc);
CGContextConcatCTM(gc, trf3);
[dccLabel.layer renderInContext:gc];
CGContextRestoreGState(gc);

UIImage *blendedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[dccLabel release];

Я читал, что, если позиции не являются целыми числами, это может вызвать пикселизацию.Но я не думаю, что это проблема здесь.Я также запускал инструменты в режиме основной анимации и включил «Color Misaligned Images», но созданное мной изображение не отображается как цветное, хотя другие изображения делают.

Кто-нибудь знает, почему текст в UILabeldccLabel размыт и пикселизирован, и как я могу это исправить?

1 Ответ

0 голосов
/ 06 ноября 2011

Разобрался, взял меня немного!И ответ довольно прост.Нужно было сделать newSize того же размера, что и прямоугольник, в который рисуется изображение.

 CGSize newSize  = CGSizeMake(300, 120); 

В некотором смысле имеет смысл сделать размер изображения таким же, как размер прямоугольника, в который рисуется изображение, верно?

...