如何在iOS中屏蔽UIViews

时间:2010-12-30 03:12:06

标签: ios uiview mask

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

我想使用灰色图像掩盖UIView(需要转换为alpha刻度以进行遮罩)。 UIView有背景。掩盖图像应该很容易,但我想屏蔽任何UIView。

任何线索都将受到赞赏。

3 个答案:

答案 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!

结果:

example screenshot

答案 2 :(得分:1)

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

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