Как визуализировать растянутый текст в iOS?

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

введите описание изображения здесь

  1. Это не то же самое, что просто изменить размер шрифта
  2. Оказывая это как растровое изображение, а затем масштабирование, это не вариант (это выглядит ужасно)
  3. Векторная графика – это способ сделать это

Решение

Я придумал следующее, которое, похоже, работает для моих целей. Код нарисовывает одну строку масштабирования текста для заполнения границ. Подкласс UIView и замените drawRect следующим образом.

 - (void)drawRect:(CGRect)rect { [self drawScaledString:@"Abcde"]; } - (void)drawScaledString:(NSString *)string { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetTextMatrix(context, CGAffineTransformIdentity); NSAttributedString *attrString = [self generateAttributedString:string]; CFAttributedStringSetAttribute((CFMutableAttributedStringRef)attrString, CFRangeMake(0, string.length), kCTForegroundColorAttributeName, [UIColor redColor].CGColor); CTLineRef line = CTLineCreateWithAttributedString((CFAttributedStringRef) attrString); // CTLineGetTypographicBounds doesn't give correct values, // using GetImageBounds instead CGRect imageBounds = CTLineGetImageBounds(line, context); CGFloat width = imageBounds.size.width; CGFloat height = imageBounds.size.height; CGFloat padding = 0; width += padding; height += padding; float sx = self.bounds.size.width / width; float sy = self.bounds.size.height / height; CGContextSetTextMatrix(context, CGAffineTransformIdentity); CGContextTranslateCTM(context, 1, self.bounds.size.height); CGContextScaleCTM(context, 1, -1); CGContextScaleCTM(context, sx, sy); CGContextSetTextPosition(context, -imageBounds.origin.x + padding/2, -imageBounds.origin.y + padding/2); CTLineDraw(line, context); CFRelease(line); } - (NSAttributedString *)generateAttributedString:(NSString *)string { CTFontRef helv = CTFontCreateWithName(CFSTR("Helvetica-Bold"),20, NULL); CGColorRef color = [UIColor blackColor].CGColor; NSDictionary *attributesDict = [NSDictionary dictionaryWithObjectsAndKeys: (id)helv, (NSString *)kCTFontAttributeName, color, (NSString *)kCTForegroundColorAttributeName, nil]; NSAttributedString *attrString = [[[NSMutableAttributedString alloc] initWithString:string attributes:attributesDict] autorelease]; return attrString; } 

Пример использования:

 CGRect rect = CGRectMake(0, 0, 50, 280); MyCTLabel *label = [[MyCTLabel alloc] initWithFrame:rect]; label.backgroundColor = [UIColor whiteColor]; [self addSubview:label]; 

Вы можете попробовать CoreText. Получите CTFramesetter , вычислите его rect, затем вычислите аффинное преобразование, необходимое для сжатия этого прямоугольника в нужные вам границы и установите его как CTM. Затем, когда вы рисуете текст, он должен растягивать его надлежащим образом при полном качестве.

Вы можете установить свойство преобразования UILabel и масштабировать ширину:

 [myLabel sizeToFit]; myLabel.transform = CGAffineTransformMakeScale(0.5, 1.0); 

вы также можете попробовать с помощью @property(nonatomic) BOOL adjustsFontSizeToFitWidth и @property minimumFontSize

Первоначально вы можете установить гораздо более высокое значение свойства font, а также инициализировать minimumFontSize с минимальным значением шрифта.

  • Когда изменяются параметрыFontSizeToFitWidth или boundingRectWithSize, измените context.actualScaleFactor?
  • как получить все UILabels в UIView
  • Подробнее / Меньше с Swift 3
  • Как проверить, является ли UILabel атрибутомText или нормальным текстом программно?
  • В UILabel несколько строк с несколькими цветами для каждой строки?
  • UILabel для автоматического прерывания линии, когда линия слишком длинная
  • Word Wrap не работает для UILabel
  • Вертикально выравнивать текст внутри UILabel (Примечание: использование AutoLayout)
  • Как сделать вертикальный текст UILabel и UITextView для iOS в Swift?
  • Позиционирование UILabel непосредственно под другим UILabel
  • Где этот вертикальный интервал, исходящий из UILabelView?
  • Давайте будем гением компьютера.