UIView 反转掩码 MaskView

Posted

技术标签:

【中文标题】UIView 反转掩码 MaskView【英文标题】:UIView invert mask MaskView 【发布时间】:2017-10-21 11:25:37 【问题描述】:

我想对我的 UIView 应用一个倒置蒙版。我将掩码设置为带有透明图像的 UIImageView。然而输出与

view.mask = imageView

不是想要的结果。如下图所示,我怎样才能达到预期的效果?所需的结果使用蒙版切口作为透明度。当我检查视图的掩码时,它不是 CAShapeLayer,所以我不能那样反转它。

【问题讨论】:

【参考方案1】:

似乎你可以做一些事情。您可以使用您拥有的图像,但掩盖一个白色视图并在其后面放置一个蓝色视图。或者您可以通过反转透明度来调整您正在使用的图像资源。或者您可以使用CoreImage 在代码中执行此操作。例如:

func invertMask(_ image: UIImage) -> UIImage?

    guard let inputMaskImage = CIImage(image: image),
        let backgroundImageFilter = CIFilter(name: "CIConstantColorGenerator", withInputParameters: [kCIInputColorKey: CIColor.black]), 
        let inputColorFilter = CIFilter(name: "CIConstantColorGenerator", withInputParameters: [kCIInputColorKey: CIColor.clear]), 
        let inputImage = inputColorFilter.outputImage, 
        let backgroundImage = backgroundImageFilter.outputImage,
        let filter = CIFilter(name: "CIBlendWithAlphaMask", withInputParameters: [kCIInputImageKey: inputImage, kCIInputBackgroundImageKey: backgroundImage, kCIInputMaskImageKey: inputMaskImage]),
        let filterOutput = filter.outputImage,
        let outputImage = CIContext().createCGImage(filterOutput, from: inputMaskImage.extent) else  return nil 
    let finalOutputImage = UIImage(cgImage: outputImage)
    return finalOutputImage

【讨论】:

太棒了!我唯一的问题是 imageView 比 UIView 小,所以掩码只显示带有切口的倒置图像。我该如何解决? 我想最简单的方法是将imageViewframe 设置为与您要屏蔽的视图相同的大小,并将imageViewcontentMode 设置为.scaleAspectFill 但很难确切知道该怎么做。也许你可以用你想要发生的事情来更新你的问题。

以上是关于UIView 反转掩码 MaskView的主要内容,如果未能解决你的问题,请参考以下文章

UIView 上的圆形图层的 Swift 掩码

如何以编程方式设置 UIView 的自动调整大小掩码?

具有自动反转功能的 UIView 动画

如何实现执行 contentStretch 反转的 UIView?

如何反转 UIView 特定区域的颜色?

iOS:UIView 阻止用户交互,但不是子视图