iOS10 beta3 上的图像遮罩失败

Image masking fails on iOS10 beta3

一段时间以来,我们使用以下代码将不透明的灰度图像屏蔽为彩色图像。

在 Apple 发布 iOS 10 beta 3 之前,这一直工作正常。突然不再应用遮罩,导致返回的只是一个带有给定颜色的方框。

这背后的逻辑可以在 https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_images/dq_images.html

在 header 使用图像遮罩遮蔽图像

这段代码的逻辑: * 拍摄一张没有alpha的灰度图 * 用给定的颜色创建一个纯色图像 * 根据给定的图像创建一个蒙版 * 用创建的蒙版蒙住实体图像 * 输出是一个蒙版图像,也考虑了两者之间的颜色(灰色可能是浅红色)。

有人知道如何修复此功能吗? 如果你有 XCode 8 beta 3,你可以 运行 这段代码,在低于 iOS 10 的模拟器上,这将正常工作,在 iOS 10 上,它只会创建一个正方形盒子

示例图片:

    public static func image(maskedWith color: UIColor, imageNamed imageName: String) -> UIImage? {

    guard let image = UIImage(named: imageName)?.withRenderingMode(.alwaysOriginal) else {
        return nil
    }

    guard image.size != CGSize.zero else {
        return nil
    }

    guard
        let maskRef = image.cgImage,
        let colorImage = self.image(with: color, size: image.size),
        let cgColorImage = colorImage.cgImage,
        let dataProvider = maskRef.dataProvider
        else {
        return nil
    }

    guard
        let mask = CGImage(maskWidth: maskRef.width, height: maskRef.height, bitsPerComponent: maskRef.bitsPerComponent, bitsPerPixel: maskRef.bitsPerPixel, bytesPerRow: maskRef.bytesPerRow, provider: dataProvider, decode: nil, shouldInterpolate: true),
        let masked = cgColorImage.masking(mask)
        else {
        return nil
    }

    let result = UIImage(cgImage: masked, scale: UIScreen.main().scale, orientation: image.imageOrientation)

    return result
}

public static func image(with color: UIColor, size: CGSize) -> UIImage? {

    guard size != CGSize.zero else {
        return nil
    }

    let rect = CGRect(origin: CGPoint.zero, size: size)

    UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main().scale)

    defer {
        UIGraphicsEndImageContext()
    }

    guard let context = UIGraphicsGetCurrentContext() else {
        return nil
    }

    context.setFillColor(color.cgColor)
    context.fill(rect)

    let image = UIGraphicsGetImageFromCurrentImageContext()

    return image;
}

此问题已在 iOS10 beta 4 中解决。