2012-03-19 50 views
0

我使用委托方法drawLayer:inContext来更改背景不透明度,因为它在屏幕上移动时会变为小框。该图层在初始化时将UIImage设置为内容。当使用drawLayer时,UIImage内容消失(并重新出现):inContext

每次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]; 
} 

回答

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; 
} 

这将调用作为显示过程的一部分,随时随地层或任何其superlayers的已调用其-setNeedsLayout方法。通常这是自动发生的,但根据导致图层移动的确切原因,您可能需要手动完成。试试看看。

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

+0

这肯定更有意义。 如果我只想改变内容图像的不透明度,但保持背景颜色不变,该怎么办? (我在此图层上调用setNeedsDisplay。) – astoffel 2012-03-19 21:20:20

+0

您可能需要两个图层,一个绘制背景,另一个绘制图像。你会改变图像层的'opacity'属性。根据您的设置,其中一个图层可能是另一个图层的子图层 - 这可能会更容易以这种方式进行组织。 – 2012-03-19 21:22:19

+0

这正是我所做的。 2层,图像层作为另一层的子层,然后改变图像层的不透明度。现在很好用!谢谢! – astoffel 2012-03-21 17:57:48

相关问题