2009-08-01 2 views
3

Как я могу использовать оба эти параметра в одном и том же UIView правильно?CALayer drawInContext vs addSublayer

Я один заказ на подклассы CALayer, в котором я рисую картину в пределах drawInContext

У меня есть другой, в котором я установить оверлей PNG изображения в качестве содержимого.

У меня есть третий, который является лишь фоном.

Как наложить все 3 из этих предметов?

[self.layer addSublayer:bottomLayer]; // this line is the problem 

[squaresLayer drawInContext:viewContext]; 
[self.layer addSublayer:imgLayer]; 

Другие 2 сами рисуют правильно, если я делаю их в указанном порядке. Независимо от того, где я пытаюсь установить нижний слой, он всегда предотвращает рисование squaresLayer. Причина, по которой мне нужны 3 слоя, я намерен анимировать цвета в фоновом режиме и пользовательских слоях. Верхний слой - это просто графическое наложение.

+0

Несколько вопросов: Вы уверены, что слой не нарисован? Или это делается, но не дает вам результаты, которые вы ищете? Как слои перекрываются? Нужно ли, чтобы эти слои были в одном представлении, или вы могли бы разбить один из них на другое представление? – Amagrammer

+0

Привет, ну, они ДОЛЖНЫ быть в том же UIView, я полагаю, что я мог бы использовать subviews, похоже, немного использовать отдельные представления только для составных слоев. Однако я придумал решение, сделав 2 пользовательских слоя. Все, что добавлено в self.layer через «addSublayer», похоже, опирается на что-либо, нарисованное с помощью «drawInContext», которое прямо обращается к контексту .layer. Итак, выяснив это, я просто отобрал 2 слоя в этом контексте и добавил imgLayer сверху. Прекрасно работает, поскольку анимация завершается с использованием NSTimer, обновляющего представление, в котором выполняется drawInContext. – Michael

ответ

1

Может также вставить код в в случае, если кто-то пытается оживить сложенных CALayers, которые имеют свои собственные внутренние дро Подпрограммы

- (void)drawRect:(CGRect)rect { 

    [imgLayer removeFromSuperlayer]; 

    CGFloat w = [self.blockViewDelegate w]; 
    CGFloat h = [self.blockViewDelegate h]; 

    CGFloat wb = w/4; 
    CGFloat hb = h/4; 

    CGContextRef viewContext = UIGraphicsGetCurrentContext(); 

    // Layers 

    [bottomLayer sizes:wb :hb :1]; 
    bottomLayer.frame = CGRectMake(0, 0, w, h); 
    bottomLayer.opaque = NO; 

    [topLayer sizes:wb :hb :0]; 
    topLayer.frame = CGRectMake(0, 0, w, h); 
    topLayer.opaque = NO; 

    // Overlay 

    imgLayer.frame = CGRectMake(0, 0, w, h); 
    imgLayer.opaque = NO; 
    imgLayer.opacity = 1.0f; 

    UIImage *overlay = [self.blockViewDelegate image]; 
    CGImageRef img = overlay.CGImage; 
    imgLayer.contents = (id)img; 

    // Add layers 

    [bottomLayer drawInContext:viewContext]; 
    [topLayer drawInContext:viewContext]; 
    [self.layer addSublayer:imgLayer]; 

} 

blockViewDelegate где я храню ширину, высоту и информацию изображения, то контроллер для этого UIView.

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

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