CALayer alpha面具无法正常工作

Mat*_*t H 3 iphone objective-c calayer quartz-graphics ios

我正在尝试创建一个将图像绘制到图层,然后设置该图层的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;
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏.

pe8*_*ter 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);
    
    Run Code Online (Sandbox Code Playgroud)