我正在尝试创建一个将图像绘制到图层,然后设置该图层的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;
非常感谢任何帮助。
答案 0 :(得分:11)
您的代码存在一些问题:
CALayer类引用表示遮罩层的alpha用于遮罩父图层。您的遮罩层(alphaLayer)是使用JPG创建的,该JPG不包含Alpha值。 Quartz不明白你想要将掩码图像中的灰度RGB像素值用作alpha值,并且没有代码可以调用来执行此操作(据我所知)。
Quartz可能会将掩码图像中缺少的alpha解释为每个像素的0 alpha,这就是显示任何内容的原因。
我建议使用Pixelmator之类的绘图程序,并从原始叶图像中制作PNG文件(内置alpha值)。这样做不需要在代码中添加遮罩层。
您的文件名是“leaf-alfa.jpg”,但在您的代码中是“leaf_alpha.jpg”。
子图层必须在其父图层的坐标中布局。您没有这样做,也没有为遮罩层设置边界。图层的默认边界是空矩形,因此即使您使用了具有适当alpha遮罩的图像,您仍然看不到任何东西(或者可能只是没有遮罩的原始叶图像)。你需要做这样的事情:
alphaLayer.bounds = CGRectMake(0, 0, 128, 192);
alphaLayer.position = CGPointMake(sublayer.bounds.size.width/2.0,
sublayer.bounds.size.height/2.0);