IPhone - Как нарисовать текст в середине прямоугольника
Есть ли способ рисования текста в середине прямоугольника. Я могу найти различные выравнивания, но ничто, что я пробовал, не может вертикально центрировать текст в прямоугольнике.
Есть ли простой способ сделать это, или есть какой-то способ центрировать прямоугольник, а затем нарисовать его?
Я рисую непосредственно в CGContext, пытаясь использовать NSString:: drawWithRect или что-то подобное, так как я действительно не хочу добавлять ярлык только для отображения основного текста.
Ответы
Ответ 1
Ну, свойство font pointSize
соответствует непосредственно высоте в пикселях NSString
, нарисованной в этом UIFont
, поэтому ваша формула будет примерно такой:
- (void) drawString: (NSString*) s
withFont: (UIFont*) font
inRect: (CGRect) contextRect {
CGFloat fontHeight = font.pointSize;
CGFloat yOffset = (contextRect.size.height - fontHeight) / 2.0;
CGRect textRect = CGRectMake(0, yOffset, contextRect.size.width, fontHeight);
[s drawInRect: textRect
withFont: font
lineBreakMode: UILineBreakModeClip
alignment: UITextAlignmentCenter];
}
UITextAlignmentCenter
обрабатывает центрирование horizontal
, поэтому мы используем полную ширину contextRect. lineBreakMode
может быть любым, что вам нравится.
Ответ 2
Здесь обновлена версия для iOS7.0 +.
Я также улучшил этот ответ, используя метод sizeWithAttributes:
, который возвращает границы текста, позволяющие правильно позиционировать текст перед его рисованием. Это устраняет необходимость жесткого кодирования любых настроек, которые будут ломаться, если вы используете шрифт другого размера или используете другой шрифт.
- (void) drawString: (NSString*) s
withFont: (UIFont*) font
inRect: (CGRect) contextRect {
/// Make a copy of the default paragraph style
NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
/// Set line break mode
paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
/// Set text alignment
paragraphStyle.alignment = NSTextAlignmentCenter;
NSDictionary *attributes = @{ NSFontAttributeName: font,
NSForegroundColorAttributeName: [UIColor whiteColor],
NSParagraphStyleAttributeName: paragraphStyle };
CGSize size = [s sizeWithAttributes:attributes];
CGRect textRect = CGRectMake(contextRect.origin.x + floorf((contextRect.size.width - size.width) / 2),
contextRect.origin.y + floorf((contextRect.size.height - size.height) / 2),
size.width,
size.height);
[s drawInRect:textRect withAttributes:attributes];
}
Ответ 3
В iOS 6 вам присваиваются строки и выравнивания абзацев, поэтому это становится намного более простым и мощным. В этом примере мы рисуем большой красный "A" в середине прямоугольника:
NSMutableParagraphStyle* p = [NSMutableParagraphStyle new];
p.alignment = NSTextAlignmentCenter;
NSAttributedString* bigA =
[[NSAttributedString alloc] initWithString:@"A" attributes:@{
NSFontAttributeName: [UIFont fontWithName:@"Georgia" size:100],
NSForegroundColorAttributeName: [UIColor redColor],
NSParagraphStyleAttributeName: p
}];
[bigA drawInRect:CGRectMake(0,0,200,200)];
Ответ 4
Я согласен с ответом amagrammer, за исключением небольшого изменения: я использую font.lineSize
для получения правильной высоты. Я предполагаю, что sizeWithFont
также предоставит вам LineSize
Ответ 5
Я нашел, что этот код работает очень хорошо:
NSString *text = @"A bit of text to draw";
UIFont *font = [UIFont systemFontOfSize:12];
CGRect textFrame = (CGRect)
{
.size.width = 150,
.size.height = 150,
};
CGSize textSize = [text sizeWithFont:font constrainedToSize:textFrame.size lineBreakMode:NSLineBreakByWordWrapping];
CGRect newTextFrame = CGRectInset(textFrame, 0, (textFrame.size.height - textSize.height) / 2);
[text drawInRect:newTextFrame withFont:font lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentCenter];
Текст, шрифт и содержащий фрейм могут поступать из любого места, поэтому просто используйте один и тот же режим прерывания строки, когда выполняете расчет и рисунок.