Текст UILabel становится пикселизированным при рендеринге Context с использованием CGContextDrawImage

#iphone #uilabel #core-text

#iPhone #uilabel #основной текст

Вопрос:

Я использую CoreText на iPhone для получения курсивного текста в UIScrollView. CoreText на iPhone не поддерживает изображения. Итак, я говорю CoreText предоставить некоторое пространство для изображения, а затем использую CGContextDrawImage для рисования изображения blendedImage в прямоугольнике 300 на 120, что соответствует соотношению 2,5. Созданное изображение, которое в приведенном ниже коде является blendedImage, имеет тот же размер, что и 175/70 = 2,5. Поскольку создаваемое мной изображение blendedImage содержит текст, который я также хочу перенести в word, я создаю изображение, используя 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];
  

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

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

Ответ №1:

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

  CGSize newSize  = CGSizeMake(300, 120); 
  

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