2009-07-12 15 views
5

Dziwna sytuacja - przykłady z prac w Apple, ale po tym jak je trochę zmienię, tekst nie jest wyświetlany. Ten fragment kodu słusznie zwraca niebieskie tło ale odmawia rysowania tekstu na nim bez względu na to, co mam zrobić:iPhone: jak narysować tekst w oknie?

#import <UIKit/UIKit.h> 

@interface CWnd : UIWindow @end 
@implementation CWnd 

- (void) drawRect : (CGRect) i_poRect 
{ 
    // This is working : windows is blue. 
    CGContextRef oContex = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBFillColor(oContex, 0, 0, 255, 1); 
    CGContextFillRect(oContex, i_poRect); 
    // This is not working : not text is displayed. 
    CGContextSelectFont(oContex, "Monaco", 10, kCGEncodingFontSpecific); 
    CGContextSetRGBStrokeColor(oContex, 255, 0, 0, 1); 
    CGContextSetRGBFillColor(oContex, 255, 0, 0, 1); 
    CGContextSetTextDrawingMode(oContex, kCGTextFill); 
    CGContextSetTextPosition(oContex, 100, 100); 
    CGContextShowText(oContex, "abc", 3); 
} 

@end 

@interface CDelegate : NSObject <UIApplicationDelegate> @end 
@implementation CDelegate 

- (void)applicationDidFinishLaunching : (UIApplication *) i_poApp 
{ 
    CGRect oRect = [ [ UIScreen mainScreen ] bounds ]; 
    [ [ [ CWnd alloc] initWithFrame : oRect ] makeKeyAndVisible ]; 
} 

@end 

int main(int argc, char *argv[]) 
{  
    return UIApplicationMain(argc, argv, nil, @"CDelegate"); 
} 
+2

Teraz, kiedy na to patrzę, nie wierzę, że Monaco jest obsługiwaną czcionką na iPhonie. Wypróbuj Helvetica i zobacz, czy rysuje: http://www.alexcurylo.com/blog/2008/10/05/snippet-available-uifonts/ –

+0

Masz rację. Brak czcionki o nazwie "monaco" - wypróbowałem dwie najczęściej używane czcionki na moim komputerze MacOS i nie zgadłem. Szkoda, że ​​CGContextSelectFont nie wyrzuca wyjĘ ... tku, jeś li nie jest dostę pna nieobsługiwana czcionka :(To może dać się na koniec w wersji do debugowania – grigoryvp

Odpowiedz

5

Użyłem następujący kod bez problemu wyciągnąć tekst bezpośrednio do kontekstu Quartz:

CGContextSetStrokeColorWithColor(context, strokeColor); 
CGContextSetFillColorWithColor(context, strokeColor); 

CGContextSelectFont(context, "Helvetica", fontSize, kCGEncodingMacRoman); 
CGContextSetTextDrawingMode(context, kCGTextFill); 
CGContextSetTextPosition(context, 0.0f, round(fontSize/4.0f)); 
CGContextShowText(context, [text UTF8String], strlen([text UTF8String])); 

To nie jest oczywiste, co się dzieje nie tak w twoim przypadku. W tym przypadku należy zwrócić uwagę na dwie rzeczy: tekst może zostać odwrócony do góry nogami z powodu odwróconej przestrzeni współrzędnych UIViews i ich CALayerów, a jak wskazuje Rhythmic Fistman, nie obsługuje to kodowania UTF.

Lepszym, choć mniej wydajnych, podejście jest zrobić coś takiego:

CGContextSetFillColorWithColor(context, strokeColor); 
[text drawAtPoint:CGPointMake(0.0f, 0.0f) withFont:[UIFont fontWithName:@"Helvetica" size:fontSize]]; 
+0

[@ "abc" UTF8String] nie działa ani – grigoryvp

+0

btw, angielski tekst w UTF-8 jest binarnie zgodny z tekstem angielskim w ASCII :(. – grigoryvp

+0

CGContextSelectFont nie działa poprawnie dla Czcionki takie jak AppleGothic Czy wiesz, jak to naprawić? – Ganesh

1

Inni ludzie (here i here) zrobili pewne przekształcenia afiniczne i stosowane metody CGContextShowTextAtPoint w celu uczynienia go praca:

CGContextSelectFont(oContex, @"Monaco", 10, kCGEncodingFontSpecific); 
CGContextSetTextDrawingMode(oContex, kCGTextFill); 
CGContextSetRGBFillColor(oContex, 1.0, 0.0, 0.0, 1.0); 
CGAffineTransform xform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0); 
CGContextSetTextMatrix(oContex, xform); 
CGContextShowTextAtPoint(oContex, 100, 100, "abc", 3); 

Innym problemem jest to, że możliwy sposób CGContextSetRGBFillColor pobiera argumenty zmiennoprzecinkowych w zakresie od 0,0 do 1,0. Używasz 255, aby wskazać "pełny kolor", co nie jest tym, czego oczekuje ta metoda. Poniższa powinny działać, jeśli są bardziej komfortowe z zakresu od 0 do 255:

CGContextSetRGBFillColor(oContex, 255/255.0, 0/255.0, 0/255.0, 1.0); 
+0

Zmiana 255 do 1.0f nie pomaga Dodawanie transformacji nie pomaga – grigoryvp

1

Hej, może być problemem kodowania.

Spróbuj zmienić kCGEncodingFontSpecific na kCGEncodingMacRoman.

Później, gdy wszystko działa, pozbądź się CGContextShowTextAtPoint.
To jest śmieci, non-unicode i używać wersji glifów, które musisz
dzwonić zabronione API. Lepiej wykorzystaj UIKit do rysowania tekstu.
To zrozumiałe dla Unicode, a także przyzwoite zastąpienie glifów dla znaków
, których nie ma w Twojej czcionce.

+0

Nie działa również Przy okazji, możesz skopiować i wkleić mój kod, nie będzie potrzebny projekt ani coś takiego, po prostu skompiluj pojedynczy plik .m, uruchom go i przekonaj się sam :) – grigoryvp

+0

Brak tutaj kompilatora. Czy próbowałeś tego kodu w bardziej tradycyjnym projekcie, np. Z plikiem .xib? –

+0

Jeśli to działa z plikiem .xib i nie działa bez niego, będzie to niszcząca czarna magia. I na pewno muszę wiedzieć DLACZEGO to nie działa :( – grigoryvp

3

Hej, właśnie znalazłem notatkę w moim kodu.

Najwyraźniej CGContextShowTextAtPoint nie działa z CGContextSetFont.
Należy zamiast tego użyć CGContextSelectFont. To oczywiste, co?

W każdym razie wiem, że tak nie jest, ale można spróbować użyć opcji CGContextShowTextAtPoint.

To prawdopodobnie nie należało do osobnej odpowiedzi.

+0

CGContextSelectFont jest funkcją, której używam od początku.To wszystko po prostu nie działa :(I nie mogę znaleźć prostego przykładu jabłka, aby degradować go do takiego kodu w znaczący sposób czas. – grigoryvp

1

Jest jeszcze jedna możliwość, a mianowicie, że określona pozycja tekstu leży poza prostokątem, w którym próbujesz rysować. Łatwo to sprawdzić przez podstawienie

CGContextSetTextPosition(oContex, 100, 100); 

z

CGContextSetTextPosition(oContex, CGRectGetMidX(i_poRect), CGRectGetMidY(i_poRect)); 
1

metody użycie CGContextSetTextMatrix."Problem odwrotny" pochodzi z matrycy.

Powiązane problemy