2009-08-19 22 views
18

Bir dikdörtgenin ortasında metin çizme yöntemi var mı? Çeşitli hizalamaları bulabilirim, fakat denediğim hiçbir şey metni dikey olarak bir doğrultuda ortalayabilir.iPhone - Bir rect'in ortasındaki metin nasıl çizilir?

Bunu yapmak için basit bir yöntem var mı, yoksa bir dikdörtgeni ortalamanın ve daha sonra çizmenin bir yolu var mı?

NSString :: drawWithRect veya benzer bir şeyi kullanmaya çalıştığımdan CGContext'e doğrudan çizim yapıyorum, çünkü bazı temel metinleri oluşturmak için bir Etiket eklemek istemiyorum.

cevap

29

Eh, yazı mülkiyet pointSize böylece formül böyle bir şey olacağını, bu UIFont çizilmiş bir NSString piksel yüksekliğe doğrudan gelir:

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

UITextAlignmentCenterhorizontal merkezleme kolları, bu yüzden kullanmak contextRect'in tam genişliği. lineBreakMode, ne istersen olabilir.

+0

Bu, neyle gittiğime çok yakın. Teşekkürler – Xetius

+3

Bir şey değil. Ne sorabilirdin, sorabilir miyim? – Amagrammer

+6

Merhaba, bunun oldukça eski olduğunu biliyorum ama sadece kullandım ve bir değişiklik yapmak zorundaydım. Değişikliğim, CGRect textRect ... satırıydı. Bunu değiştirdim ... CGRect textRect = CGRectMake (contextRect.origin.x, contextRect.origin.y + yOffSet, contextRect.size.width, fontHeight); – Fogmeister

2

iOS 6'da, öznitelikli dizeleri ve paragraf dizilimlerini alırsınız, böylece bu çok daha basit ve güçlü hale gelir. Bu örnekte, bir dikdörtgenin ortasında büyük kırmızı "A" çizmek:

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)]; 
+3

için çalışmıyor Bu metni yatay olarak ortalar ancak dikey olarak hizalamaz. – Clay

+0

"Dikey hizala"? Sadece istediğin yere çiz. Ya da bir şeye çizin (örneğin, bir görüntü) ve onu istediğiniz yere koyun. – matt

+8

Doğru - Ne dediğini anlıyorum. Bence sorunun, bir şeyi daha büyük bir şeyin merkezinde dikey olarak nasıl hizalayacağına dair olduğunu düşünüyorum. Önceden belirlenmiş bir 'NSRect' verildiğinde, örneğin [myString drawInRect: myRect] 'seçeneğini veya dizeyi' myRect'in dikey merkezinde konumlandırmak için nasıl kullanabilirsiniz. Kakao için, https://github.com/jerrykrinock/CategoriesObjC'den 'NS (Nitelikli) String + Geometrics' kategorisini ekleyerek ve' - (float) heightForWidth: (float) ile basit bir matematik yaparak yapıyorum. width' yöntemi. – Clay

1

Ben küçük değişiklik dışında amagrammer en yanıta katılabilir: Ben uygun yüksekliği elde etmek font.lineSize kullanın. Ben bu kod oldukça iyi çalışıyor buldum sizeWithFont size lineSize yanı

+0

Sana katılıyorum ama lineSize veya lineHeight? – damithH

0

verecektir varsayalım:

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

metin, yazı tipi ve böylece sadece aynı satırını kullanın, her yerden gelebilir çerçeveyi içeren hesaplama ve çizim yaptığınızda mola modu.

17

Burada iOS7.0 + için güncellenmiş bir sürüm var.

Ayrıca, metni çizmeden önce uygun şekilde konumlandırmanızı sağlayan metnin sınırlarını döndüren sizeWithAttributes: yöntemini kullanarak da yukarıdaki yanıtı geliştirdim. Bu, farklı bir boyut yazı tipi kullanırsanız veya farklı bir yazı tipi kullanırsanız kırılacak tüm ayarların kodlanması ihtiyacını ortadan kaldırır.

- (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]; 
} 
İlgili konular