如何在iOS中对UIView进行遮罩处理

31

我看到类似的问题,但没有找到可行的答案。

我想使用灰色图像来遮盖UIView(需要转换为Alpha比例以实现遮罩效果)。这个UIView有背景。 遮罩图像很容易,但我想要遮罩任何UIView。

非常感谢您提供任何线索。

3个回答

68

我已经为这个问题工作了几个小时,并且有一个解决方案,我认为它可以满足你的需求。首先,使用任何你认为合适的方法创建你的遮罩图像。请注意,我们只需要alpha值,所有其他颜色将被忽略,因此,请确保你使用的方法支持alpha值。在这个例子中,我是从.png文件加载的,但是不要尝试使用.jpg文件,因为它们没有alpha值。

接下来,创建一个新图层,将你的遮罩分配到它的内容,并将这个新图层设置为你的UIView自己的图层,就像这样:你应该会发现这会对UIView及其附加的子视图进行遮罩:

UIImage *_maskingImage = [UIImage imageNamed:@"mask"];
CALayer *_maskingLayer = [CALayer layer];
_maskingLayer.frame = theView.bounds;
[_maskingLayer setContents:(id)[_maskingImage CGImage]];
[theView.layer setMask:_maskingLayer];

完成这个操作后,您可以将UIView的背景颜色设置为任何您喜欢的颜色,然后使用遮罩创建一个有色滤镜。

编辑:从iOS8开始,你现在可以通过将另一个视图分配给其maskView属性来简单地对视图进行遮罩。普遍规则保持不变,即maskView的alpha层用于确定应用于其上的视图的不透明度。


谢谢你的回答。问题是我只有灰度图像(所有点的alpha==1)。我想将灰度图像转换为alpha图像。你有什么想法吗? - subchap
2
最好的方法是将其带入像Photoshop这样的图像编辑套件中进行转换。另一种方法是通过编程方式进行转换,方法是创建一个新的图像上下文,然后逐像素遍历旧图像,读取灰度组件,并将其转换为alpha组件,以便在绘制到新图像之前将其绘制成新颜色。虽然这很费时且浪费时间,但您可以通过使用绘图软件来减少处理器时间。 - Ash
1
在Photoshop中,这很容易完成:(1)创建一个新图层(2)用黑色填充其中的一部分(3)给它添加一个图层蒙版(4)将灰度图像粘贴到蒙版中。黑色=透明,白色=不透明,灰色是不同程度的透明度。(5)应用图层蒙版(右键单击图层面板中的蒙版本身,然后单击“应用图层蒙版”)(6)裁剪出您需要的图层部分。 - Christopher Swasey
我想说我不小心点了踩,现在它不让我取消踩 :( 这是一个很棒的答案! - Tim

9

对于针对iOS 8.0+的应用程序,这种方法效果很好(在本例中使用渐变作为遮罩)。它避免了任何需要调整遮罩大小或位置的需求。

// Add gradient mask to view
func addGradientMask(targetView: UIView)
{
    let gradientMask = CAGradientLayer()

    gradientMask.frame = targetView.bounds
    gradientMask.colors = [UIColor.blackColor().CGColor, UIColor.clearColor().CGColor]
    gradientMask.locations = [0.8, 1.0]

    let maskView: UIView = UIView()
    maskView.layer.addSublayer(gradientMask)

    targetView.maskView = maskView 
}

在我的情况下,我想要用户开始滚动时移除遮罩。可以通过以下方式实现:
func scrollViewWillBeginDragging(scrollView: UIScrollView) {

    exerDetailsTableView.maskView = nil        
}

视图被定义为 @IBOutlet:

@IBOutlet weak var exerDetailsTableView: UITableView!

结果:

示例截图


1

我脑海中不知道确切的代码,但基本思路是有两个UIView。其中一个UIView的图像属性设置为灰度图像,另一个UIView则像往常一样设置,唯一的区别是您需要将初始UIView直接放在包含“正常”图像的UIView上方。

希望这足以推动您的想法更进一步。


谢谢您的回答。我没有说明清楚,我想要的是将灰度图像转换为Alpha图像(就像普通遮罩一样),并将其应用于UIView。 - subchap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接