如何在iOS中掩盖UIViews

我见过类似的问题,但还没有find可行的答案。

我想用一个灰色的图像掩盖一个UIView(需要转换为阿尔法缩放掩盖)。 UIView有背景。 应该很容易掩盖图像,但我想掩盖任何UIView。

任何线索将不胜感激。

我一直在研究这个问题几个小时,并有一个解决scheme,我认为会做你想做的。 首先,使用任何您认为合适的方法创build您的蒙版图像。 请注意,在这里我们只需要alpha值,所有其他的颜色将被忽略,所以确保你使用的方法支持alpha值。 在这个例子中,我从.png文件中加载,但是不要使用.jpg文件来尝试,因为它们没有alpha值。

接下来,创build一个新图层,将其掩码指定给它的内容,并将这个新图层设置为你的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的背景颜色设置为任何您喜欢的颜色,并使用蒙版来创build彩色滤镜。

编辑:作为iOS8,你现在可以简单地通过分配另一个视图到其maskView属性来掩盖一个视图。 通用规则保持不变,即使用maskView的alpha图层来确定应用的视图的不透明度。

对于面向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! 

结果:

示例截图

我不知道我的头顶上的确切代码,但基本的想法是有两个UIViews。 一个UIView将它的图像属性设置为灰度图像,另一个UIView将像往常一样设置,唯一的区别是您将初始的UIView直接放置在包含“普通”图像的UIView的顶部。

我希望这足以让你的想法更进一步。