IOS7 устаревание NSString drawAtPoint: forWidth: withFont: minFontSize: actualFontSize: lineBreakMode: baselineAdjustment:

С выпуском iOS7 следующая функция устарела:

drawAtPoint:forWidth:withFont:minFontSize:actualFontSize:lineBreakMode:baselineAdjustment:

В документации Apple предлагается использовать

drawInRect:withAttributes:

Я использую эту функцию из-за параметра minFontSize, который позволяет мне нарисовать строку внутри прямоугольника. Если текст не подходит, он сначала уменьшит размер текста до minFontSize, а затем, если он не подходит, он усекает его. Я пока не могу это сделать, используя drawInRect:withAttributes:

Может ли кто-нибудь помочь мне определить, какой ключ я могу использовать для определения эквивалента minFontSize?

Спасибо!

Роб

Ответ 1

Это немного сложнее, чем раньше, и вы не можете использовать минимальный размер шрифта, но должны использовать минимальный коэффициент масштабирования шрифта. В IOS SDK есть ошибка, которая разбивает ее для большинства случаев использования (см. Примечания внизу). Вот что вам нужно сделать:

// Create text attributes
NSDictionary *textAttributes = @{NSFontAttributeName: [UIFont systemFontOfSize:18.0]};

// Create string drawing context
NSStringDrawingContext *drawingContext = [[NSStringDrawingContext alloc] init];
drawingContext.minimumScaleFactor = 0.5; // Half the font size

CGRect drawRect = CGRectMake(0.0, 0.0, 200.0, 100.0);
[string drawWithRect:drawRect
             options:NSStringDrawingUsesLineFragmentOrigin
          attributes:textAttributes
             context:drawingContext];

Примечания:

  • Кажется, что в iOS 7 SDK есть ошибка, по крайней мере, до версии 7.0.3: если вы укажете пользовательский шрифт в атрибутах, miniumScaleFactor будет проигнорирован. Если вы передаете nil для атрибутов, текст будет масштабирован правильно.

  • Важна опция NSStringDrawingUsesLineFragmentOrigin. Он сообщает системе рисования текста, что прямая прямая рисования должна находиться в верхнем левом углу.

  • Невозможно установить базовую настройку с помощью нового метода. Вы должны сделать это сами, сначала позвонив boundingRectWithSize:options:attributes:context:, а затем отредактировав прямоугольник, прежде чем передавать его на drawWithRect:options:attributes:context.

Ответ 2

После долгого поиска в Google я не нашел решения, работающего под iOS7. Сейчас я использую следующее обходное решение, зная, что он очень уродлив. Я визуализирую UILabel в памяти, сделаю скриншот и нарисую это. UILabel может правильно сжимать текст.

Возможно, кто-то сочтет это полезным.

    UILabel *myLabel = [[UILabel alloc] initWithFrame:myLabelFrame];
    myLabel.font = [UIFont fontWithName:@"HelveticaNeue-BoldItalic" size:16];
    myLabel.text = @"Some text that is too long";
    myLabel.minimumScaleFactor = 0.5;
    myLabel.adjustsFontSizeToFitWidth = YES;
    myLabel.backgroundColor = [UIColor clearColor];

    UIGraphicsBeginImageContextWithOptions(myLabelFrame.size, NO, 0.0f);
    [[myLabel layer] renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [screenshot drawInRect:myLabel.frame];

Ответ 3

просто создайте словарь NS с этим ключом и атрибутом, чтобы он был

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: @"15", @"minFontSize", @"value2", @"key2", nil];
//in key2 and value2 you could set any other of the attributes included in the first method
[yourString drawInRect:rect withAttributes:attributes];

Ответ 4

Я использовал следующее, чтобы решить мою проблему. Используя приведенный ниже код, вы можете drawAtPoint, установить шрифт, размер шрифта и цвет шрифта в месте X, Y.

[String drawAtPoint: CGPointMake (X, Y)         withAttributes: @{NSFontAttributeName: [UIFont fontWithName: @ "Helvetica-Bold" size: 18], NSForegroundColorAttributeName: [UIColor colorWithRed: 199.0f/255.0f green: 0.0f/255.0f blue: 54.0f/255.0f alpha: 1.0f ]}];