使用drawLayer:inContext时,UIImage内容消失(并重新出现)

时间:2012-03-19 15:50:40

标签: objective-c ios image calayer

我正在使用委托方法drawLayer:inContext来更改小盒子在屏幕上移动时的背景不透明度。该图层在初始化时将UIImage设置为内容。

每次调用drawLayer:inContext时,图像将会消失或重新出现(来回切换),从而在屏幕上显示出口吃的动作。

我将图像数据作为委托类中的本地ivar,因此不需要每次都重新加载。

我不确定是什么原因造成的。有任何想法吗?这是我正在使用的代码:

- (id)init
{
    self = [super init];
    if(self) {
        UIImage *layerImage = [UIImage imageNamed:@"Hypno.png"];
        image = layerImage.CGImage;
    }
    return self;
}

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    float alpha = layer.position.y / layer.superlayer.bounds.size.height;
    UIColor *reddish = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:alpha];
    CGColorRef cgReddish = reddish.CGColor;
    layer.backgroundColor = cgReddish;
    [layer setContents:(id)image];
}

1 个答案:

答案 0 :(得分:0)

请勿使用-drawLayer:inContext:。该方法用于绘制CG上下文,然后使用Core Graphics或UIKit方法成为图层的内容。您根本不想更改图层的内容 - 您希望将其设置为图像,一次,然后再不再触摸它。

您的图像正在显示和消失,因为有时图层会显示图像,有时图层会显示您在-drawLayer:inContext:中显示的内容 - 即没有任何内容。

(另外:为了调用-drawLayer:inContext:,您必须致电[layer setNeedsDisplay],或者您已打开图层needsDisplayOnBoundsChange或类似内容。请勿执行任何操作那个。)

相反,请尝试使用CALayer布局机制。例如,在图层的委托中:

- (void)layoutSublayersOfLayer:(CALayer *)layer
{
    float alpha = layer.position.y / layer.superlayer.bounds.size.height;
    UIColor *reddish = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:alpha];
    CGColorRef cgReddish = reddish.CGColor;
    layer.backgroundColor = cgReddish;
}

只要图层或其任何超级图层调用了-setNeedsLayout方法,就会在显示过程中调用此方法。通常这会自动发生,但取决于究竟是什么原因导致图层移动,您可能需要手动执行此操作。试试吧,看看。

(或者:既然你已经有了改变图层位置的代码,为什么不同时更改图层的背景颜色?)