Кварцевые 2D графические контексты - PullRequest
0 голосов
/ 18 декабря 2009

Почему функции Quartz 2D Graphics Contextxts должны вызываться из метода drawRect?

Потому что, если я вызываю контекстную функцию CGGraphics из любого места, кроме как внутри drawRect, я получаю сообщения вроде этого:

<Error>: CGContextFillRects: invalid context
<Error>: CGContextSetFillColorWithColor: invalid context

На самом деле в подклассе UIView я настраиваю графический контекст в методе, называемом Render. Ставка при вызове Render вызывает следующие ошибки:

- (void)Render {
    CGContextRef g = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(g, [UIColor blueColor].CGColor);
    CGContextFillRect(g, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height));
    CGContextSetFillColorWithColor(g, [UIColor blackColor].CGColor);
    [@"It works!" drawAtPoint:CGPointMake(10.0, 20.0) withFont:[UIFont systemFontOfSize:[UIFont systemFontSize]]];
    NSLog(@"gsTest Render");
}

Ответы [ 2 ]

3 голосов
/ 18 декабря 2009

Они не. Может быть, вы должны уточнить немного больше.

Какао устанавливает контекст для вас перед вызовом вашей реализации drawRect. Если вы хотите нарисовать что-то где-то еще, то эта работа по настройке - ваша ответственность.

2 голосов
/ 18 декабря 2009

UIGraphicsGetCurrentContext извлекает графический контекст из стека, который устанавливается платформой. UIKit гарантирует, что когда вызывается метод drawRect, в этот стек помещается допустимый графический контекст. После того, как вы вернетесь от него, этот стек выталкивается. Если вы вызываете его вне функции drawRect, оно будет недействительным.

Вместо этого, если вы хотите вызвать его вне drawRect, вам нужно создать / получить собственный графический контекст и нарисовать его.

Некоторые функции рисования, такие как NSString drawAtPoint: withFont: также используют этот стек; если текущий контекст недействителен, вам нужно вызвать UIGraphicsPushContext

...