Подтвердить что ты не робот

IPhone - Как нарисовать текст в середине прямоугольника

Есть ли способ рисования текста в середине прямоугольника. Я могу найти различные выравнивания, но ничто, что я пробовал, не может вертикально центрировать текст в прямоугольнике.

Есть ли простой способ сделать это, или есть какой-то способ центрировать прямоугольник, а затем нарисовать его?

Я рисую непосредственно в CGContext, пытаясь использовать NSString:: drawWithRect или что-то подобное, так как я действительно не хочу добавлять ярлык только для отображения основного текста.

4b9b3361

Ответ 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];

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