составные цвета: CALayer и режим смешивания на iPhone - PullRequest
6 голосов
/ 02 ноября 2009

Я пытаюсь использовать образ ядра на iphone. Я могу объединить свои цвета, используя кварц, чтобы нарисовать uiview, но я хочу разделить каждый компонент на CALayer (UIview потребляет больше ресурсов).

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

Вот мой код:

@implementation WhiteLayerHelper

    - (void)drawLayer:(CALayer *)theLayer
            inContext:(CGContextRef)myContext
    {
        // draw a white overlay, with special blending and alpha values, so that the saturation can be animated
        CGContextSetBlendMode(myContext,kCGBlendModeSaturation);
        CGContextSetRGBFillColor(myContext,1.0,1.0,1.0,0.9);
        CGContextFillRect(myContext,[UIScreen mainScreen].bounds);

    }

@end

А вот код drawrect основного вида, где я использую мой CALayer:

- (void)drawRect:(CGRect)rect {
    //get the drawing context
    CGContextRef myContext = UIGraphicsGetCurrentContext();
    // draw the background
    [self fillContext:myContext withBounds:m_overlayRect withImage:m_currentImage];
    [whiteLayer renderInContext:myContext];

}

Что-то не так?

Ответы [ 3 ]

7 голосов
/ 15 августа 2010

Мне удалось получить эффект компоновки нескольких слоев CALay, нарисовав их непосредственно в графическом контексте UIView.

-(void)drawRect:(CGRect)rect {
 CGContextRef c = UIGraphicsGetCurrentContext();
 CGContextSetBlendMode(c, kCGBlendModeDifference);
 [myLayer drawInContext:c];
}

Кстати, я не добавил слои в качестве подслоев слоя вида (то есть я никогда не называл [myView.layer addSublayer: myLayer])

4 голосов
/ 14 июля 2010

Этот метод не является недостатком Core Animation, потому что слои предварительно визуализируются в контексты изображения. Базовое изображение используется для фильтрации в реальном времени (во время анимации и тому подобного) этих изображений по отношению к фоновым слоям и их изображениям. Поэтому для этой способности используются свойства композитинга CALayer, которые недоступны на iPhone / iOS (пока) из-за требования Core Image.

OpenGL может сделать это для нас в нашей ситуации, однако =)

edit (add): установка режима наложения с помощью CGContext в -drawInContext: и -drawLayer: inContext: конечно, все еще влияет на то, что уже было визуализировано или представлено в изображении этого контекста. (когда он установлен до того, как что-либо было визуализировано в контексте (изображение), это эффект смешивания с полным черным или полным белым (я не уверен, какой =)

1 голос
/ 01 июня 2010

Совсем нет ... Я думаю, что для этого проще использовать opengl, потому что, похоже, он еще не реализован в CA.

...