2009-08-15 2 views
3

Я могу создать UIImage из слоя Core Animation, используя следующий код:CAShaperLayer -renderInContext не работает?

- (UIImage*)contentsImage; 
{ 
    UIGraphicsBeginImageContext([self bounds].size); 
    [self renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 

Этот код находится в моем CALayer производном классе. Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть два CAShapeLayers, которые являются дочерними уровнями моего слоя, которые не отображаются в результате полученного изображения. Если я добавлю стандартные CALayers в качестве детей, они получат штраф. В документах Apple говорится:

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

В нем также говорится, что он доступен с iPhone OS 2.0. Удивление, если что-то мне не хватает или я должен подать радар.

Любые идеи, что может помешать ребенку CAShapeLayers получить образы к изображению?

Спасибо.

ответ

4

Аппарат CALayer вызывает renderInContext для создания его свойства растрового содержимого. Но в CAShapeLayer, свойство пути фактически не оказало на его содержание, как видно на эту ноте в заголовке:

Форма в целом скомбинирован между содержимым слоя и ее первым подслоем.

Понятно, что renderInContext фактически не отображает путь CAShapeLayer в ваш контекст. Однако я на самом деле не пробовал это для себя.

+0

Интересно. Интересно, что Apple вернется на радар, который я подал, - если это предполагаемое поведение. Я не уверен, что это даже означает, что он был составлен между содержимым и первым подуровнем. Как? Думаю, это объяснило бы это. Не кажется, что его даже часть содержимого, если я читаю это право. –

+0

Есть ли у вас обновления? – gwdp

0

Не знаю, если его отношение к вам, но есть примечание в документации CALayer для renderInContext, который говорит:

**Important**: The Mac OS X v10.5 implementation of this method does not 
support the entire Core Animation composition model. QCCompositionLayer, 
CAOpenGLLayer, and QTMovieLayer layers are not rendered. Additionally, 
layers that use 3D transforms are not rendered, nor are layers that specify 
backgroundFilters, filters, compositingFilter, or a mask values. 
Future versions of Mac OS X may add support for rendering these layers 
and properties.

В любом случае, я столкнулся с подобной проблемой при использовании функции UIView DrawRect в сочетании с рисунком в контексте изображения. Общий UIView, который содержал subviews, не рисовал бы его subviews, если бы я назвал drawRect (что имеет смысл сейчас на самом деле, поскольку он говорит в документации, если вы вызываете drawRect, вы несете ответственность за заполнение всей этой области, вне зависимости от реализаций супер и subview). Я решил свою проблему, просто вызвав drawRect во всех моих подзаголовках, передав им свои собственные фреймы.

Так что я предлагаю, возможно, отказаться от renderInContext и использовать drawInContext CALayer вместо этого? Вам придется переопределить метод, поскольку по умолчанию он ничего не делает. В ваших подклассах также потребуется переместить контексты в соответствующие рамки. Кроме того, чтобы быть в безопасности, вы можете проверить, что ни один из добавленных вами кодов не влияет на нормальный рендеринг этих слоев.

+0

Странно, потому что я не использую ни одно из полей, указанных в этом уведомлении. Проблема в том, что я хочу отображать слои в качестве изображения, а затем повторно использовать изображение, так как только добавление слоя в дерево слоев создает заметное ухудшение производительности по сравнению с использованием изображения. Я использую его в ячейке таблицы, поэтому мне нужно сделать его более эффективным, но я хочу нарисовать изображение «на лету», поскольку графический художник создает новое изображение каждый раз, когда нам нужен новый скин, нежелательно. Я полагаю, что есть другие способы, не связанные с CA. Спасибо за ответ. –

0

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

+0

Я обнаружил, что ничего, кроме самой фигуры, ничего не делает. Я думаю, что так оно и было разработано, но документация просто слабая. На боковой ноте вы можете найти это интересно: http://tumbljack.com/post/179975074/complex-interpolation-with-cashapelayer-free –

+0

Вы когда-нибудь получали ответ от Apple? – haroldcampbell