【问题标题】:Masking an image in Swift using CALayer and UIImage使用 CALayer 和 UIImage 在 Swift 中屏蔽图像
【发布时间】:2015-02-26 05:50:08
【问题描述】:

我正在使用 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;
    }

}

【问题讨论】:

    标签: swift uiimageview uiimage calayer masking


    【解决方案1】:

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

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

       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)
      
    • 第三个也是最大的问题是你的蒙版图像永远不会进入你的蒙版层,因为你忘记提取它的CGImage

      maskLayer.contents = maskImage.CGImage
      

    最后一个是真正的杀手,因为如果您将contents 设置为 UIImage 而不提取其CGImage,则图像会静默 无法进入图层。没有错误消息,没有崩溃 - 也没有图像。

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

    【讨论】:

    • 感谢您的回复。三点都对。我仍然有一定与 CALayer 对象的大小和定位有关的问题。我是这个主题的新手。我将发表另一条评论,详细说明问题以及可能的修复或更多问题。谢谢!
    • 提出一个新问题!如果你在这里给我留言,我会试着看看它。 - 请注意,如果您阅读了我的书中关于层的章节,您就不会犯上述任何错误:apeth.com/iOSBook/ch16.html 所有三点都被明确而强调地提及。
    • 感谢您提供图书章节的链接。我承认我需要先彻底学习。我几乎有时间压力,这就是我开始黑客攻击的原因。我的问题是我不知道如何将蒙版对齐到原始图像上。我想显示任意大小的图像。我以编程方式生成掩码的内容,使其与图像大小相同。面具中间的这个洞只是一个测试。运行此程序后,我想要一个需要覆盖整个图像的更复杂的蒙版。我将不胜感激任何帮助以使这种对齐方式正确。谢谢!
    • 这真的需要一个新问题!
    • 我在这里发布了一个新问题:stackoverflow.com/questions/27714562/…。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2012-07-28
    相关资源
    最近更新 更多