2011-05-06 90 views
3

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

这里有两个图像我使用(只样本我在网上找到) 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; 

任何帮助是极大的赞赏。

回答

11

有几个问题与您的代码:

  1. 的CALayer的类引用说,掩膜层的阿尔法是用来掩盖父层。您的遮罩层(alphaLayer)是使用不包含Alpha值的JPG创建的。 Quartz并不理解你想在掩模图像中使用灰度RGB像素值作为alpha值,并且没有可以调用的代码(据我所知)。

    石英可能会解释为什么没有显示每个像素的面具图像中的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); 
    
+0

感谢。 #1和3做的伎俩。感谢帮助。 – 2011-05-08 11:31:32