使用CALayer和UIImage在Swift中屏蔽图像

use*_*722 5 masking calayer uiimageview uiimage swift

我在Swift编程.我想使用CALayer和UIImage来屏蔽图像.我正在以编程方式创建我的蒙版图像.创建的蒙版图像是一个UIImage,当我自己查看它时工作正常.但当我用它作为面具时,整个屏幕变成白色.我怀疑我的问题在于配置CALayer对象.我很感激你的帮助.谢谢!

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        var maskImageSize = CGSizeMake(self.imageView.frame.width, self.imageView.frame.height)
        UIGraphicsBeginImageContextWithOptions(maskImageSize, false, 0.0)

        var color = UIColor(white: 1.0, alpha: 1.0)
        color.setFill()
        var rect = CGRectMake(0, 0, self.imageView.frame.width, self.imageView.frame.height)
        UIRectFill(rect)

        color = UIColor(white: 0.0, alpha: 1.0)
        color.setFill()
        rect = CGRectMake((self.imageView.frame.width/2)-100, (self.imageView.frame.height/2)-100, 200, 200)
        UIRectFill(rect)

        var maskImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        var maskLayer = CALayer()
        maskLayer.contents = maskImage
        maskLayer.contentsRect = CGRectMake(0, 0, self.imageView.bounds.width, self.imageView.bounds.height)


        self.imageView.image = UIImage(named: "pictobemasked.png")

        self.imageView.layer.mask = maskLayer;
    }

}
Run Code Online (Sandbox Code Playgroud)

mat*_*att 12

不幸的是,你问的问题非常糟糕 - 你还没有说出你真正想要的是什么!但是,看起来好像你可能试图使用蒙版在图像视图中打一个矩形孔.如果是这样,您的代码至少有三个巨大的缺陷.

  • 您的代码不起作用的一个原因是掩码基于透明度而不是颜色.你使用的是不透明的白色和不透明的黑色,它们都是不透明的,所以没有区别.你需要两种颜色:

     var color = UIColor(white: 1.0, alpha: 1.0)
    // ... and then, later ...
    color = UIColor(white: 1.0, alpha: 0.0)
    
    Run Code Online (Sandbox Code Playgroud)
  • 第二个问题是您的图层没有大小.你需要给它一个:

    var maskLayer = CALayer()
    maskLayer.frame = CGRectMake(
        0, 0, self.imageView.bounds.width, self.imageView.bounds.height)
    
    Run Code Online (Sandbox Code Playgroud)
  • 第三个也是最大的问题是你的面具图像永远不会进入你的面具层,因为你忘了提取它CGImage:

    maskLayer.contents = maskImage.CGImage
    
    Run Code Online (Sandbox Code Playgroud)

最后一个真的是杀手,因为如果你设置contentsUIImage而不提取它CGImage,那么图像会无声地进入图层.没有错误消息,没有崩溃 - 也没有图像.

在你的代码中进行了这三个修正,我能够使掩模在图像中打出一个矩形孔.因此,如果这是您的目的,那么这些变化将实现它.