2015-05-31 12 views
9

Görünümünde kenar boşlukları kalmadan NSAttributedString çizimi yapmakta sorun yaşıyorum.Görünümde kenar boşlukları olmayan bir dizeyi nasıl çizebilirim?

NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:72.0f]}; 
NSAttributedString *string = [[NSAttributedString alloc] initWithString:@"Hello" 
                  attributes:attributes]; 
[string drawWithRect:rect 
      options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesDeviceMetrics 
      context:nil]; 

Bu aşağıda davranışa yol açar:

String drawn with margins

Not sol ve üst kısmında marjları İşte benim kod.

  1. Bu kenar boşluklarından nasıl kaçınabilirim ve metni içerdiği görünümün kenarlarıyla tam olarak nasıl eşleştirebilirim? İstediğim şey görüntünün kenarlarını karşılayacak gerçek çizilmiş metin için, yani, herhangi bir glifte çizilen en üst piksel, görünümün en üstünde olmalı ve herhangi bir glifte çizilen en soldaki piksel sol tarafın solundadır. görünüm.
  2. 1 varsayarsak, çizilen metnin gerçek genişliğini ve yüksekliğini elde edebilmemin bir yolu var, böylece yazıyı alt ve sağ kenarlarla da birleştirmek için yazı tipi boyutunu ve karakter aralığını hesaplayabilirim?

Ben bakış kenarlarını karşılamak yapmadan metni hizalama yolları da olabileceğini biliyoruz, ama bana görünüm sezgisel benzeri autolayout kullanarak ve çalışmak için izin verecektir bakış kenarlarını birleşmesini sağlama.

Dize, önde gelen veya devam eden boşluk içeriyorsa, bu davranış hakkında umurumda değil.

Bu, NSAttributedString ile mümkün değilse, bu davranışı önereceğiniz başka yollar var mı?

burada aradığınızı muhtemelen numarada 1.

Desired behavior

+0

soru ile ilgili 2: http://stackoverflow.com/questions/3429671/how-to-get-the-width-of-an-nsstring – luk2302

+0

İkinci resim neden doğru? "O" dan sonra boşluk var ve tüm harflerin altında boşluk var. Bana öyle görünüyor ki, kendinize, neyin peşinde olduğunuzu açıkça belirtmediniz. – matt

+0

Ayrıca, renkli arka plan kritik mi? Çünkü eğer arkaplan net olsaydı, manzara sınırlarının nerede olduğunu kimse bilemezdi ve mesele düşecekti. – matt

cevap

3

Kullanım CoreText, CTLineGetTypographicBounds() için görmek istediği bu, netleştirmek için. Bunu kendim kullanmadım. Aşağıdaki kod fikri göstermektedir (üst/sol kenar boşluğu olmayan özel bir UIView'e "Hello" harfi çizerek).

override func drawRect(rect: CGRect) { 
    let context = UIGraphicsGetCurrentContext() 
    UIGraphicsPushContext(context) 

    let viewHeight = bounds.size.height 

    let attributedString = NSAttributedString(string: "Hello") 
    let line = CTLineCreateWithAttributedString(attributedString) 
    var ascent: CGFloat = 0.0 
    let width = CTLineGetTypographicBounds(line, &ascent, nil, nil) 

    CGContextSaveGState(context) 

    CGContextScaleCTM(context, 1.0, -1.0); 
    CGContextTranslateCTM(context, 0, -viewHeight) 
    CGContextSetTextPosition(context, 0, viewHeight - ascent) 
    CTLineDraw(line, context) 

    CGContextRestoreGState(context) 

    UIGraphicsPopContext() 
} 
+0

İstediğimi yapmak için bunu nasıl kullanabileceğimi açıklayabilir misiniz? – Luke

+0

Yanlış anlaşılmayı önlemek için, "kenar boşlukları" ile tam olarak ne demek istediğinizi gösteren bir resim yayınlayabilir misiniz? –

+0

Netleştirmek için düzenlenmiştir. – Luke

1

Bunu deneyin.

float fonsize = 30.0; 
NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:fonsize]}; 
NSAttributedString *string = [[NSAttributedString alloc] initWithString:@"HelloWorld" 
                  attributes:attributes]; 
CGSize stringBoundingBox = [string.string sizeWithFont:[UIFont systemFontOfSize:fonsize]]; 
CGRect rect = CGRectMake(50, 50, stringBoundingBox.width,stringBoundingBox.height); 

UILabel* lbl = [[UILabel alloc] initWithFrame:rect]; 
lbl.backgroundColor = [UIColor yellowColor]; 
lbl.attributedText = string; 
[self.view addSubview:lbl]; 
+0

Teşekkürler, bir şansım olduğunda buna bir şans vereceğim. – Luke

+0

Bu, istediğim davranışı üretmiyor. – Luke

5

Sen, genişlik vektör değerleri CoreText kullanarak yüksekliği elde edebilirsiniz:

double fWidth = CTLineGetTypographicBounds(line, &ascent, &descent, &leading); 
size_t width = (size_t)ceilf(fWidth); 
size_t height = (size_t)ceilf(ascent + descent + leading); 

böylece rect alabilirsiniz. Ancak üst kenar boşluğu yanlış

İlgili konular