2009-10-14 12 views
6

ile kullanmak için bir cString'e dönüştürme CGContextShowTextAtPoint kullanarak bir String çiziyorum. Bu yüzden ben çizmek istiyorum benim NSString c dizeleri içine dönüştürmek gerekir. Maalesef euro para birimi simgesi gibi özel semboller doğru şekilde gösterilmiyor. NSString'i CGContextShowTextAtPoint

CGContextSelectFont(currentContext, "TrebuchetMS", 15, kCGEncodingMacRoman); 

CGContextShowTextAtPoint(currentContext, 0, 0, [myString cStringUsingEncoding:[NSString defaultCStringEncoding]], [myString length]); 

Ben CGContextSelectFont işlevinde kCGEncodingFontSpecific kodlaması ile denedim ama bu da işe yaramadı.

Performans nedeniyle, NSString tarafından sağlanan drawInRect işlevlerini değil, CG İşlevini kullanmam gerekir.

Belki bana yardım edebilirsiniz!

PS:

+1

İki şey: 1. defaultCStringEncoding öğesinin UTF-8 veya MacRoman olduğunu ve 2. CGContextShowTextAtPoint() öğesine son bağımsız değişken olarak iletilen sürenin, karakter uzunluğuna değil, bayt cinsinden C dizesinin uzunluğunun olması gerektiğine dair bir garanti yoktur. NSString'in –

+1

Evet, MacRoman kodlaması için, [NSString defaultCStringEncoding] yerine NSMacOSRomanStringEncoding öğesini kullanmak istersiniz. –

cevap

6

"özel sembolleri" Unicode kodlama tarafından desteklenen kastediyoruz ... Bunu bir sıklıkla verilen bir konu olduğunu biliyorum, ama çalışma alamıyorum neden çözemiyorum NSString, ancak Core Graphics yazı tipi çizim rutinleri tarafından kullanılan MacRoman kodlaması (CGContextSelectFont() kullanarak ayarlayabileceğiniz yalnızca iki kodlama kCGEncodingMacRoman ve kCGEncodingFontSpecific). Metin çizmek için CGContextShowTextAtPoint() yolunun dezavantajı budur. Bu nedenle, NSString'in -drawAtPoint: yöntemini, Çekirdek Grafik bağlamında elle metin çizmem gerektiğinde kullanıyorum.

Performans devam ettiği sürece, an earlier answer numaralı bir yorumda, Kyle, drawAtPoint karşılaştırması yaptı: saniyede 75 kez çizim yaparken, saniyede 99 kez CGContextShowTextAtPoint() çizimi. Bu, çekme hızındaki muazzam bir fark değil, bu şekilde devam ederek çok fazla kazanmıyorsunuz. Benim deneyimime göre, -drawAtPoint: uygulamalarım için yeterince hızlıydı.

DÜZENLEME (10/14/2009): Sixten Otto'nun işaret ettiği gibi, kendi kodumu yanlış okuyorum. UTF-8, tam karakter aralığını destekliyor, fontun MacRoman'ı yapmıyor.

+0

Herhangi bir Unicode karakteri UTF-8'de ifade edilebilir. –

+0

Unicode kodlamayı kullanarak NSStrings'imi c dizelerine dönüştürdüğümde sorun çözülmez mi? – Erik

+0

CoreGraphics metin çiziminin a) Unicode uyumlu olup olmadığına ve b) diğer yazı tiplerinden eksik glifleri çekip çekmeyeceğine bağlıdır. TrebuchetMS, çizmeye çalıştığınız tüm karakterler için gliflere sahip olmayabilir. Yine, NSString yöntemleriyle daha iyi olursun. –