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

标签 swift uiimageview uiimage calayer masking

我正在用 Swift 编程。我想使用 CALayer 和 UIImage 来遮盖图像。我正在以编程方式创建我的蒙版图像。创建的蒙版图像是一个 UIImage,当我单独查看它时效果很好。但是当我将它用作 mask 时,整个屏幕都变白了。我怀疑我的问题出在配置 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;
    }

}

最佳答案

不幸的是,您的问题问得相当糟糕——您没有说出您实际上想做什么!然而,它看起来好像您可能正在尝试使用 mask 在您的 ImageView 中打一个矩形孔。如果是这样,您的代码至少存在三个巨大缺陷。

  • 您的代码无法正常工作的一个原因是蒙版基于透明度,而不是颜色。您使用的是不透明的白色和不透明的黑色,它们都是不透明的,因此没有区别。你需要你的两种颜色是这样的:

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

    var maskLayer = CALayer()
    maskLayer.frame = CGRectMake(
        0, 0, self.imageView.bounds.width, self.imageView.bounds.height)
    
  • 第三个也是最大的问题是您的 mask 图像永远不会进入您的 mask 层,因为您忘记提取它的 CGImage:

    maskLayer.contents = maskImage.CGImage
    

最后一个真的是 killer ,因为如果你将 contents 设置为 UIImage 而没有提取它的 CGImage,图像将无声地失败进入图层。没有错误消息,没有崩溃 - 也没有图像。

在您的代码中进行这三项更正后,我能够使蒙版在图像中打出一个矩形孔。因此,如果这是您的目的,那么这些更改将实现它。

关于swift - 使用 CALayer 和 UIImage 在 Swift 中屏蔽图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27699098/

相关文章:

iphone - 如何将 UILabel View 更改为 UIImageView Xcode,Iphone

ios - 在 uiimageview 中具有边框的着色区域

ios - 展开 Nil 时如何拦截 EXC_BAD_INSTRUCTION

php - 我该如何使用 Facebook 访问 token ?

ios - Xcode 11 : How to stack editor vertically?

ios - 如何在 swift 4.x 中使用 SwiftyJSON 对 [json] 进行排序?

swift - UITableViewCell 内 UIImageView 的动态大小

ios - 如何制作uiimageview圆。?

ios - 用于视网膜显示的带有 UIImage 的 UIColor 模式

iphone - 缩放和绘制图像时 CGContextStrokePath 不起作用