2009-10-14 10 views
6

Rysuję ciąg za pomocą CGContextShowTextAtPoint. Dlatego muszę przekonwertować mój NSString, który chcę narysować na c Struny. Niestety symbole specjalne, takie jak symbol waluty euro, nie są wyświetlane poprawnie.Konwersja NSString na cString do użycia z CGContextShowTextAtPoint

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

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

próbowałem go z kodowaniem kCGEncodingFontSpecific w funkcji CGContextSelectFont ale to nie działało.

Ze względów wydajnościowych muszę korzystać z funkcji CG, a nie z funkcji drawInRect dostarczanych przez NSString.

Może możesz mi pomóc!

PS: Wiem, że to jest często wystawiane temat, ale nie mogę zrozumieć, dlaczego nie mogę dostać pracy ...

+1

Dwie rzeczy: 1. nie ma gwarancji, że defaultCStringEncoding jest albo UTF-8 lub MacRoman, i 2. długość przekazana jako ostatni argument do CGContextShowTextAtPoint() powinna być długością łańcucha C w bajtach, a nie długością znaku NSString. –

+1

Tak, w przypadku kodowania MacRoman, należy użyć NSMacOSRomanStringEncoding zamiast [NSString defaultCStringEncoding]. –

Odpowiedz

6

Te „specjalne symbole” masz na myśli są obsługiwane przez kodowanie Unicode NSString, ale nie kodowanie MacRoman używane przez twoje rysunki rdzenia graficznego Core Graphics (jedynymi dwoma kodowaniami, które możesz ustawić za pomocą CGContextSelectFont() są kCGEncodingMacRoman i kCGEncodingFontSpecific). Jest to wada metody CGContextShowTextAtPoint() do rysowania tekstu. Z tego powodu używam metody NSString -drawAtPoint: gdy potrzebuję ręcznie narysować tekst w kontekście Core Graphics.

Jeśli chodzi o wydajność, w komentarzu na temat an earlier answer, Kyle przeprowadził analizę porównawczą metody drawAtPoint: jako rysunek 75 razy na sekundę w porównaniu z rysunkiem CGContextShowTextAtPoint() 99 razy na sekundę. To nie jest olbrzymia różnica w szybkości wyciągania, więc nie zyskujesz dużo, idąc tą drogą. Z mojego doświadczenia wynika, -drawAtPoint: było więcej niż wystarczająco szybko dla moich aplikacji.

EDYCJA (10/14/2009): Jak zauważyłem w Sixten Otto, źle odczytałem mój kod. UTF-8 obsługuje pełen zakres znaków, a MacRoman czcionki tego nie robi.

+0

Dowolny znak Unicode może być wyrażony w UTF-8. –

+0

Więc czy problem nie zostałby rozwiązany, jeśli przekonwertowałem moje NSStrings na ciągi c używając kodowania Unicode? – Erik

+0

Zależy od tego, czy tekst CoreGraphics rysujący a) jest zgodny z Unicode, a b) będzie przyciągał brakujące glify z innych czcionek. TrebuchetMS może nie mieć glifów dla wszystkich postaci, które próbujesz narysować. Ponownie, znacznie lepiej byłoby z metodami NSString. –

Powiązane problemy