我看过类似的问题,但没有找到可行的答案。
我想使用灰色图像掩盖UIView(需要转换为alpha刻度以进行遮罩)。 UIView有背景。掩盖图像应该很容易,但我想屏蔽任何UIView。
任何线索都将受到赞赏。
答案 0 :(得分: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图层用于确定应用它的视图的不透明度。
答案 1 :(得分: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!
结果:
答案 2 :(得分:1)
我不知道我头顶的确切代码,但基本的想法是有两个UIViews。一个UIView将其图像属性设置为灰度图像,另一个UIView将像往常一样设置,唯一的区别是您将初始UIView直接放置在包含“普通”图像的UIView之上。
我希望这足以让你的想法更进一步。