2009-06-09 25 views
7

Próbuję dowiedzieć się, co robię źle tutaj. Próbowałem kilku rzeczy, ale nigdy nie widziałem tego nieuchwytnego prostokąta na ekranie. Teraz to wszystko, co chcę zrobić - wystarczy narysować pojedynczy prostokąt na ekranie.Pytanie dla początkujących użytkowników: rysowanie prostokąta. Co ja robię źle?

Otrzymuję "nieprawidłowy kontekst" na wszystko oprócz CGContextSetRGBFillColor(). Uzyskanie kontekstu po tym wydaje mi się trochę nie tak, ale nie jestem w domu patrząc na przykłady, których używałem ostatniej nocy.

Czy ja też zawiodłem coś innego? Naprawdę chciałbym, aby uzyskać co najmniej tyle zrobić dzisiaj ...

- (id)initWithCoder:(NSCoder *)coder 
{ 
    CGRect myRect; 
    CGPoint myPoint; 
    CGSize mySize; 
    CGContextRef context; 

    if((self = [super initWithCoder:coder])) { 
    NSLog(@"1"); 
    currentColor = [UIColor redColor]; 
    myPoint.x = (CGFloat)100; 
    myPoint.y = (CGFloat)100; 
    mySize.width = (CGFloat)50; 
    mySize.height = (CGFloat)50; 
    NSLog(@"2"); 
    // UIGraphicsPushContext (context); 
    NSLog(@"3"); 
    CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0); 
    context = UIGraphicsGetCurrentContext(); 
    CGContextSetFillColorWithColor(context, currentColor.CGColor); 
    CGContextAddRect(context, myRect); 
    CGContextFillRect(context, myRect); 
    } 

    return self; 

} 

Dzięki,

Sean.

Odpowiedz

9

Nie należy umieszczać kodu CG w kodzie initWithCoder. Komunikat ten powinien być stosowany wyłącznie w celu INICJALIZACJI.

umieścić swój kod rysowania w:

- (void)drawRect:(CGRect)rect 

Jeśli instacji UIView ...

+12

Ponadto, nie powinieneś bezpośrednio wywoływać drawRect, ale wywołać setNeedsDisplay, więc system operacyjny odbiera go i przerysowuje widok później. – pgb

+0

Tak. Zgadza się. –

+0

Okay, więc nie powinienem używać initWithCoder() do rysowania. Ale czy to rzeczywiście odpowiada na moje pytanie? Czy przeniesienie kodu CG do innej funkcji spowoduje jakąkolwiek różnicę w tym, czy prostokąt zostanie narysowany? A jeśli chodzi o używanie/niewykorzystywanie drawRect, to teraz zdezorientowałeś mnie. Mówisz, że powinienem umieścić wszystkie parametry dla mojego prostokąta w drawRect? To też nie wydaje się właściwe - co, jeśli chcę narysować więcej niż jeden prostokąt? Jeśli istnieje prosta przykładowa aplikacja, która * właśnie * rysuje prostokąt lub kółko lub coś podobnego, chciałbym na to spojrzeć. Sean. –

40

Począwszy od szablonu View bazie stworzyć projekt o nazwie Szuflada. Dodaj klasę UIView do swojego projektu. Nazwij go SquareView (.h i .m).

Dwukrotnie kliknij DrawerViewController.xib, aby otworzyć go w konstruktora Interface. Zmień ogólny widok tam na SquareView w oknie Inspektora tożsamości (polecenie-4), korzystając z menu wyskakującego klasy Class. Zapisz i wróć do: Xcode.

Umieść ten kod w drawRect: metoda swojej SquareView.m pliku narysować duży, krzywy, pustą żółty prostokąt i mały, zielony, przezroczysty kwadratowy:

- (void)drawRect:(CGRect)rect; 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBStrokeColor(context, 1.0, 1.0, 0.0, 1.0); // yellow line 

    CGContextBeginPath(context); 

    CGContextMoveToPoint(context, 50.0, 50.0); //start point 
    CGContextAddLineToPoint(context, 250.0, 100.0); 
    CGContextAddLineToPoint(context, 250.0, 350.0); 
    CGContextAddLineToPoint(context, 50.0, 350.0); // end path 

    CGContextClosePath(context); // close path 

    CGContextSetLineWidth(context, 8.0); // this is set from now on until you explicitly change it 

    CGContextStrokePath(context); // do actual stroking 

    CGContextSetRGBFillColor(context, 0.0, 1.0, 0.0, 0.5); // green color, half transparent 
    CGContextFillRect(context, CGRectMake(20.0, 250.0, 128.0, 128.0)); // a square at the bottom left-hand corner 
} 

ty nie musisz wywołać tę metodę, aby rysunek się wydarzył. Twój kontroler widoku powiadomi widok, aby narysował się co najmniej raz, gdy program zostanie uruchomiony, a pliki NIB zostaną aktywowane.

Powiązane problemy