CALayer alpha面具无法正常工作

时间:2011-05-06 15:12:53

标签: iphone objective-c ios quartz-graphics calayer

我正在尝试创建一个将图像绘制到图层,然后设置该图层的alpha蒙版的简单示例。我将下面的代码添加到我的示例应用程序的viewDidLoad中。没有设置掩码,我可以看到叶子的图像。在我设置了面具之后,我看不出我的子层是什么。我究竟做错了什么?

这是我正在使用的两个图像(只是我在网上找到的样本) http://sorenworlds.netfirms.com/Alpha/leaf.jpg

http://sorenworlds.netfirms.com/Alpha/leaf-alfa.jpg

self.view.layer.backgroundColor = [UIColor orangeColor].CGColor;
self.view.layer.cornerRadius = 20.0;
self.view.layer.frame = CGRectInset(self.view.layer.frame, 20, 20);


CALayer *sublayer = [CALayer layer];
sublayer.backgroundColor = [UIColor blueColor].CGColor;
sublayer.shadowOffset = CGSizeMake(0, 3);
sublayer.shadowRadius = 5.0;
sublayer.shadowColor = [UIColor blackColor].CGColor;
sublayer.shadowOpacity = 0.8;
sublayer.frame = CGRectMake(30, 30, 128, 192);
[self.view.layer addSublayer:sublayer];

CGImageRef img = [UIImage imageNamed:@"leaf.jpg"].CGImage;
sublayer.borderColor = [UIColor blackColor].CGColor;
sublayer.borderWidth = 2.0;
sublayer.contents = img;

CGImageRef imgAlpha = [UIImage imageNamed:@"leaf_alpha.jpg"].CGImage;   
CALayer *alphaLayer = [CALayer layer];
alphaLayer.contents = (id)imgAlpha;
sublayer.mask = alphaLayer;

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:11)

您的代码存在一些问题:

  1. CALayer类引用表示遮罩层的alpha用于遮罩父图层。您的遮罩层(alphaLayer)是使用JPG创建的,该JPG不包含Alpha值。 Quartz不明白你想要将掩码图像中的灰度RGB像素值用作alpha值,并且没有代码可以调用来执行此操作(据我所知)。

    Quartz可能会将掩码图像中缺少的alpha解释为每个像素的0 alpha,这就是显示任何内容的原因。

    我建议使用Pixelmator之类的绘图程序,并从原始叶图像中制作PNG文件(内置alpha值)。这样做不需要在代码中添加遮罩层。

  2. 您的文件名是“leaf-alfa.jpg”,但在您的代码中是“leaf_alpha.jpg”。

  3. 子图层必须在其父图层的坐标中布局。您没有这样做,也没有为遮罩层设置边界。图层的默认边界是空矩形,因此即使您使用了具有适当alpha遮罩的图像,您仍然看不到任何东西(或者可能只是没有遮罩的原始叶图像)。你需要做这样的事情:

    alphaLayer.bounds = CGRectMake(0, 0, 128, 192);
    alphaLayer.position = CGPointMake(sublayer.bounds.size.width/2.0,
                                      sublayer.bounds.size.height/2.0);