2010-02-23 15 views
10

Uygulamamda bir yol boyunca metin oluşturmaya çalışıyorum; Bu çoğu karakter için iyidir, ancak Japonca (ya da olmayan bir Romanca olmayan). CATiledLayer'ımdaki doğru karakterleri görüntüleyen [NSString drawAtPoint] kullanılmasını tavsiye ettim; Ancak, yaklaşık 5 saniye sonra kaybolurlar. Bu sırada katmanı yakınlaştırabilirim ve düzgün bir şekilde ölçeklendirebiliyorlar, ancak CATiledLayer'a genellikle metnin geri kalanı gibi bağlı kalıyorlar.NSString'in drawAtPoint yöntemini CGContextShowGlyphsAtPoint sorunları yerine kullanarak

Görüntülemeden önce, dizeyi kontrol edip bunlardan herhangi birinin değiştirilemeyeceğine karar veriyorum. Sorunlarım zorunda kalacağım, ben drawAtpoint yerine kullanın:

if (!isFullyDisplayable) 
{ 
    CGContextShowGlyphsAtPoint(context, pt.x, pt.y, realGlyph, 1); 
} 
else { 
    // fall back on less flexible font rendering for difficult characters 

    NSString *b = [gv text]; 
    NSString *c = [b substringWithRange:NSMakeRange(j,1)]; 

    [c drawAtPoint:pt withFont:[UIFont fontWithName:@"Helvetica-Bold" size:16.0]]; 


} 

kimse metin kaybolur neden olarak herhangi işaretçiler var mı?

kısa sürede drawAtPoint ile dolmaya başlarsa benim ayıklama çıktısını kullanıldıkça:

<Error>: CGContextGetShouldSmoothFonts: invalid context 
<Error>: CGContextSetFont: invalid context 
<Error>: CGContextSetTextMatrix: invalid context 
<Error>: CGContextSetFontSize: invalid context 
<Error>: CGContextSetTextPosition: invalid context 
<Error>: CGContextShowGlyphsWithAdvances: invalid context 

yüzden benim bağlam yönetimi ile ilgili bir şey olduğunu tahmin ediyorum, ama ben kabul olduğu bu aynı ise CGContextShowGlyphsAtPoint kullandığım gibi doğru bağlamda olması gerekir?

NSString drawAtPoint: withFont: Kendi soruya cevaplama

cevap

17

bağlam yığını kullanır ve bu yöntemi çağıran yerden yığın boştu. Çağrı hileyi

ile yaptı.

+1

Bunun, yalnızca iOS 4.0 ve sonraki sürümlerde çalıştığından bahsetmelisiniz. UIKit grafik uzantıları, eski FW'lerde diş güvenli değildir. – Split

1

Tamlık için, burada Kakao için gerekli kod. Ayrıca normalde (eğer umut!) Ile aynıdır yığınında bir "çalışma" bağlam zaten orada @davbryn söylediği gibi

CGContextSaveGState(context) 
let old_nsctx = NSGraphicsContext.currentContext() // in case there was one 
// force "my" context... 
NSGraphicsContext.setCurrentContext(NSGraphicsContext(CGContext: context, flipped: true)) 

// Do any rotations, translations, etc. here 
str.drawAtPoint(cgPt, withAttributes: attributes) 

NSGraphicsContext.setCurrentContext(old_nsctx)// clean up for others 
CGContextRestoreGState(context) 

Bu

çoğunlukla olarak, gerekli değildir ... .drawInRect ile çalışır Ancak içeriğiniz, işaret ettiği gibi, bazen yoktur. Bu sorunu özellikle, içeriği açıkça belirlemeden metni göstermeyecek olan MapKit MKOverlayRenderer'un drawMapRect: ile keşfettim.