Intereting Posts
Как статическая библиотека с битовым кодом включена с нашей ошибкой? Facebook глубокой привязки не работает на iPhone Цвет UIBarButtonItem оттенка всегда отображает цвет по умолчанию Мое приложение по-прежнему показывает статус Обработка через 20 часов NSUserDefault, Alloc init vs standard Userdefault Firebase 3.x: FIRUserInfo – это «необъявленный идентификатор», Как инициализировать GMSCoorindateBounds с помощью GMSVisibleRegion интересно узнать, как знакомиться с символом в Time Profiler of Instruments с единственным адресом, отображаемым в Xcode IOS HockeyApp всегда всплывающее обновление alertview Почему этот код приводит к EXC_BAD_ACCESS при использовании ARC? как заставить горизонтальную прокрутку только на UITextView IOS – программно приостанавливает / отключает / уменьшает объем фоновой музыки, а затем восстанавливает его мутировать быстрый массив из objc? Ошибка формата NSString автоматически добавляет \ x Шкала UIImageView для заполнения

Преобразование iPhone iOS UIFont в CTFontRef вызывает несоосность размеров

Я знаю, что UIFont и CTFont – это разные вещи, но я мог любопытно заставить его работать.

Я пытаюсь создать PDF-файл и использовать UIView в качестве шаблона, однако для рисования редактируемого PDF мне нужно, чтобы CTFontRef отображал себя в определенном фрейме. Ниже мой метод, который рисует UILabel в PDF-контексте. Метод использует UILabel в качестве шаблона для имени шрифта, размера шрифта и положения , в то время как CTFontRef отображает символы в PDF.

Метод работает, но имеет причуды.

Я заметил, что код ниже может не отображаться в кадре, который достаточно велик, чтобы соответствовать тексту, написанному с помощью UIFont. Например, у меня есть 80×21 UILabel, который соответствует определенному шрифту. Если я попытаюсь отобразить этот шрифт с помощью CTFontRef, я получу пустое пространство, если я не увеличу высоту метки, скажем, 80×30. Проще говоря, CTFontRef не будет отображать текст, который не снимает рамку ни по горизонтали, ни по вертикали.

Кроме того, я заметил, что некоторые шрифты имеют разную ширину, поэтому метка 80×21, которая соответствует 20 символам UIFont, может поместиться только как 15 символов CTFontRef. Я предполагаю, что это потому, что CTFontRef не обрезает текст и просто не отображает слова, которые торчат в любом направлении из кадра.

Несколько вопросов: что может привести к неправильному выравниванию размеров шрифта? Нужно ли мне скопировать другое свойство? Есть ли способ попросить CTFontRef усечь длинные слова в конце метки?

//xOriginOffset, yOriginOffset is the X of the origin of the container view that holds the label. +(void)drawTextLabel:(UILabel*)label WithXOriginOffset:(int)xOriginOffset YOffset:(int)yOriginOffset { NSString* textToDraw = label.text; CFStringRef stringRef = (__bridge CFStringRef)textToDraw; UIFont* uiFont = label.font; // Prepare font CTFontRef font = CTFontCreateWithName((__bridge CFStringRef)uiFont.fontName, uiFont.pointSize, NULL); // Create an attributed string CFStringRef keys[] = { kCTFontAttributeName,kCTForegroundColorAttributeName }; CFTypeRef values[] = { font,[[UIColor redColor]CGColor] }; CFDictionaryRef attr = CFDictionaryCreate(NULL, (const void **)&keys, (const void **)&values, sizeof(keys) / sizeof(keys[0]), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // Prepare the text using a Core Text Framesetter CFAttributedStringRef currentText = CFAttributedStringCreate(NULL, stringRef, attr); NSAssert(currentText!=nil,@"current text is nil!"); CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(currentText); //account for the view's superview CGRect frameRect = CGRectMake(xOriginOffset+label.frame.origin.x, yOriginOffset+label.frame.origin.y, label.frame.size.width, label.frame.size.height); CGMutablePathRef framePath = CGPathCreateMutable(); CGPathAddRect(framePath, NULL, frameRect); // Get the frame that will do the rendering. CFRange currentRange = CFRangeMake(0, 0); CTFrameRef frameRef = CTFramesetterCreateFrame(framesetter, currentRange, framePath, NULL); CGPathRelease(framePath); // Get the graphics context. CGContextRef currentContext = UIGraphicsGetCurrentContext(); NSAssert(currentContext!=nil,@"currentContext is nil!"); // Draw the frame. CTFrameDraw(frameRef, currentContext); CFRelease(frameRef); CFRelease(stringRef); CFRelease(framesetter); } 

ОБНОВИТЬ:

Я реорганизовал код и теперь использую этот метод для создания полнофункционального PDF-текста.

 +(void)drawTextLabel:(UILabel*)label WithXOriginOffset:(int)xOriginOffset YOffset:(int)yOriginOffset { NSString* textToDraw = label.text; UIFont* uiFont = label.font; // Prepare font CGRect frameRect = CGRectMake(xOriginOffset+label.frame.origin.x, yOriginOffset+label.frame.origin.y, label.frame.size.width, label.frame.size.height); [textToDraw drawInRect:frameRect withFont:uiFont lineBreakMode:UILineBreakModeTailTruncation]; } 

1) Вы не можете смешивать текст, нарисованный UIKit с текстом, нарисованным CoreText . Это упоминается в документах Apple (см. Текст, веб-и редактирование программирования для iOS в разделе «Основной текст и UIKit Framework» ). (Что, кажется, происходит, так это то, что UIKit делает некоторое округление и использует некоторые ярлыки для повышения производительности, а также не выполняет кернинг по умолчанию.)

2) Нет, вы не пропустили какое-то свойство.

3) CoreText не обеспечивает простой способ обрезания текста, вам придется написать свой собственный код, чтобы сделать это.