我看到类似的问题,但没有找到可行的答案。
我想使用灰色图像来遮盖UIView(需要转换为Alpha比例以实现遮罩效果)。这个UIView有背景。 遮罩图像很容易,但我想要遮罩任何UIView。
非常感谢您提供任何线索。
我已经为这个问题工作了几个小时,并且有一个解决方案,我认为它可以满足你的需求。首先,使用任何你认为合适的方法创建你的遮罩图像。请注意,我们只需要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层用于确定应用于其上的视图的不透明度。
对于针对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!
我脑海中不知道确切的代码,但基本思路是有两个UIView。其中一个UIView的图像属性设置为灰度图像,另一个UIView则像往常一样设置,唯一的区别是您需要将初始UIView直接放在包含“正常”图像的UIView上方。
希望这足以推动您的想法更进一步。