2012-05-20 1 views
3

Мы можем создать слой из текущего графического контекста, а затем получить контекст слоя:На iOS, после того, как мы создаем слой из контекста и получаем контекст слоя, как эти контексты связаны друг с другом?

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGLayerRef layer = CGLayerCreateWithContext(context, 
              CGSizeMake(self.frame.size.width, 
               self.frame.size.height), NULL); 

CGContextRef contextOfLayer = CGLayerGetContext(layer); 

Таким образом, мы имеем теперь 2 контексты: context и contextOfLayer. Как эти два контекста связаны друг с другом? Is contextOfLayer Фактически часть context и context имеет массив указателей контекста слоя? Если я распечатываю их адреса, используя NSLog(@"%p", ...), у них разные адреса, поэтому они не являются одним и тем же объектом. И я думаю, что contextOfLayer не влияет на стек контекста, так как это просто независимый контекст, просто «существует там» сам по себе?

ответ

3

Это помогает, если вы понимаете обоснование для CGLayer. CGLayer понимается как оптимизация, когда вы неоднократно нарисовываете одно и то же содержимое в конкретном контексте.

(Например: растровые контексты с определенным форматом - например, 32-битного RGBA - или PDF контекстов и т.д.)

При создании CGLayer, вы передаете ему контекст, который вы собираетесь рисовать CGLayer в. Это позволяет CGLayer оптимизировать себя для такого контекста.

Позже, если вы нарисуете CGLayer в этом контексте или в другом контексте, который имеет тот же формат, рисунок будет быстрее.

Если вы нарисуете CGLayer в контексте с другим форматом, рисунок будет по-прежнему работать, и вы не получите ошибку. Тем не менее, это может быть не так быстро, как было бы, если бы вы просто нарисовали прямо в этом контексте.

documentation for CGLayerCreateWithContext говорит:

контекст

Графический контекст вы хотите создать слой относительно. Слой использует этот графический контекст в качестве ссылки для инициализации .

Это означает, что слой выглядит как заданный context. Это не обязательно означает, что context хранится в пределах CGLayer или на постоянной основе. Это может быть, но вы не можете сказать - это внутренняя деталь реализации.

documentation for CGLayerGetContext говорит

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

Поэтому вы должны ожидать, что context != contextOfLayer.

Опять же, API не указывает ничего о том, как эти контексты связаны друг с другом - они могут ссылаться друг на друга внутренне, или они могут и не быть. В качестве пользователей API мы ничего не должны принимать.

Чтобы ответить на ваши вопросы конкретно:

Является contextOfLayer фактически часть контекста и контекста имеет массив контекстного слоя указателей?

Мы не знаем, и мы не можем это выяснить. Как пользователи API, мы не должны писать какой-либо код, который так или иначе принимает.

Я думаю, что contextOfLayer не влияет на стек контекста, так что это просто независимый контекст, просто «существует там» сам по себе?

Да, это независимый контекст. «Стек контекста» в UIKit представляет собой концепцию более высокого уровня. CGLayer в CoreGraphics - это API нижнего уровня, который ничего не знает о UIKit.

+0

aha, спасибо ... Я хотел знать внутренности, чтобы не зависеть от того, как это реализовано, но просто для того, чтобы понять, как это работает внутри. –

+0

CoreGraphics не является открытым исходным кодом, поэтому нет способа узнать. (Если вы не захотите разобрать библиотеку, которая будет значительной работой). –

Смежные вопросы