Как установить свойство CGContextRef вместо использования UIGraphicsGetCurrentContext () - PullRequest
0 голосов
/ 04 марта 2012

Я пытался работать с UIGraphicsGetCurrentContext и CGContextRef.Мне сказали, что использование UIGraphicsGetCurrentContext () много раз плохо, и скорее работать над использованием CGContextRef и ссылаться на него.

Я пытался работать над второй частью, и у меня возникают проблемы с установкой @propertyссылаясь на это.Может кто-нибудь дать мне объявление и пример использования этого?Пробовал гуглить и не мог найти на него никаких ссылок.

Та

1 Ответ

3 голосов
/ 04 марта 2012

Вы, вероятно, не должны хранить возвращаемое значение из UIGraphicsGetCurrentContext в свойстве. Обычно вы либо не знаете, как долго будет действовать контекст, либо у контекста все равно будет короткое время жизни. Например, если вы вызываете UIGraphicsGetCurrentContext из вашего drawRect: метода, вы не знаете, как долго этот контекст проживет после возврата из drawRect:. Если вы звоните UIGraphicsGetCurrentContext после звонка UIGraphicsBeginImageContextWithOptions, вы, вероятно, скоро все равно позвоните UIGraphicsEndImageContext. Было бы неуместно хранить ссылки на эти контексты вокруг.

Если вы вызываете множество функций Core Graphics в одном и том же контексте, вы хотите сохранить контекст в локальной переменной. Например, вот метод drawRect: из одного из моих тестовых проектов:

- (void)drawRect:(CGRect)dirtyRect {
    NSLog(@"drawRect:%@", NSStringFromCGRect(dirtyRect));
    [self layoutColumnsIfNeeded];
    CGContextRef gc = UIGraphicsGetCurrentContext();
    CGContextSaveGState(gc); {
        // Flip the Y-axis of the context because that's what CoreText assumes.
        CGContextTranslateCTM(gc, 0, self.bounds.size.height);
        CGContextScaleCTM(gc, 1, -1);
        for (NSUInteger i = 0, l = CFArrayGetCount(_columnFrames); i < l; ++i) {
            CTFrameRef frame = CFArrayGetValueAtIndex(_columnFrames, i);
            CGPathRef path = CTFrameGetPath(frame);
            CGRect frameRect = CGPathGetBoundingBox(path);
            if (!CGRectIntersectsRect(frameRect, dirtyRect))
                continue;

            CTFrameDraw(frame, gc);
        }
    } CGContextRestoreGState(gc);
}

Вы можете видеть, что я делаю кучу вещей с контекстом: я сохраняю и восстанавливаю графическое состояние, я изменяю CTM, и я рисую некоторые кадры Core Text в нем. Вместо многократного вызова UIGraphicsGetCurrentContext, я вызываю его всего один раз и сохраняю результат в локальной переменной с именем gc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...