如何在iOS中屏蔽UIViews

sub*_*hap 30 mask uiview ios

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

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

任何线索将不胜感激.

Ash*_*Ash 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];
Run Code Online (Sandbox Code Playgroud)

完成此操作后,您可以将UIView的背景颜色设置为您喜欢的任何颜色,并使用蒙版创建彩色滤镜.

编辑:从iOS8开始,您现在可以通过为其maskView属性指定另一个视图来屏蔽视图.一般规则保持不变,因为maskView的alpha图层用于确定应用它的视图的不透明度.

  • 那么最好的方法是将它带入像Photoshop这样的图像编辑套件并在那里进行转换.另一种方法是通过制作新的图像上下文,然后在读取灰色组件的旧图像上逐个像素地进行编程,然后将其转换为新颜色的alpha组件,然后将其绘制到新图像中.这是费力的,浪费时间,因为你在油漆包装中使用更少的处理器时间. (2认同)

Sto*_*tip 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 
}
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我想在用户开始滚动后删除掩码.这完成了:

func scrollViewWillBeginDragging(scrollView: UIScrollView) {

    exerDetailsTableView.maskView = nil        
}
Run Code Online (Sandbox Code Playgroud)

视图定义为@IBOutlet:

@IBOutlet weak var exerDetailsTableView: UITableView!
Run Code Online (Sandbox Code Playgroud)

结果:

示例截图