Вопрос рендеринга iPhone - PullRequest
0 голосов
/ 16 мая 2010

Я новичок в разработке для iPhone / Objective-C. Я «бросил оружие» и начал читать и реализовывать некоторые главы из O'Reilly's iPhone Development. Я точно следовал коду книги, и мой код генерировал следующую ошибку:

CGContextSetFillColorWithColor: invalid context
CGContextFillRects: invalid context
CGContextSetFillColorWithColor: invalid context
CGContextGetShouldSmoothFonts: invalid context

Однако, когда я скачал пример кода для той же главы, код изменился.

Код книги:

- (void) Render {
    CGContextRef g = UIGraphicsGetCurrentContext();
    //fill background with gray
    CGContextSetFillColorWithColor(g, [UIColor grayColor].CGColor);
    CGContextFillRect(g, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height));
    //draw text in black.
    CGContextSetFillColorWithColor(g, [UIColor blackColor].CGColor);
    [@"O'Reilly Rules!" drawAtPoint:CGPointMake(10.0, 20.0) withFont:[UIFont systemFontOfSize:[UIFont systemFontSize]]];
}

Актуальный код проекта с сайта (работает):

- (void) Render {
    [self setNeedsDisplay]; //this sets up a deferred call to drawRect.
}

- (void)drawRect:(CGRect)rect {
    CGContextRef g = UIGraphicsGetCurrentContext();
    //fill background with gray
    CGContextSetFillColorWithColor(g, [UIColor grayColor].CGColor);
    CGContextFillRect(g, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height));
    //draw text in black.
    CGContextSetFillColorWithColor(g, [UIColor blackColor].CGColor);
    [@"O'Reilly Rules!" drawAtPoint:CGPointMake(10.0, 20.0) withFont:[UIFont systemFontOfSize:[UIFont systemFontSize]]];
}

Что это за строки кода, которые заставляют приложение правильно отображаться?

- (void) Render {
    [self setNeedsDisplay]; //this sets up a deferred call to drawRect.
}

- (void)drawRect:(CGRect)rect {

Заранее благодарим за помощь новичку!

1 Ответ

1 голос
/ 16 мая 2010

Когда вы рисуете что-то на экране, вам нужен графический контекст (о котором я уверен, что вы все прочитали), но это предоставляется (более или менее) только когда Cocoa вызывает -drawRect :, так ваши варианты, в основном, - это только вызов метода render в -drawRect:, который не имеет особого смысла с точки зрения того, что вы пытаетесь сделать, или если -render сообщает системе, что вы хотите нарисовать свое представление, что приведет Система (в конце концов) создаст графический контекст и вызовет ваш -drawRect: там, где должен быть фактический код рисования. В противном случае не будет графического контекста, к которому можно было бы обратиться, и я полагаю, это то, о чем говорят ваши ошибки.

(примечание: система выше означает столько же UIKit, сколько и ОС)

...