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 ]}];