2016-07-22 78 views
1

一段时间以来,我们使用以下代码来遮盖灰度图像,而不透明化彩色图像。iOS10 beta3上的图像遮罩失败

在苹果发布iOS 10 beta 3之前,它一直正常运行。突然之间,面具不再适用,导致仅使用te给定颜色返回方形框。

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

掩蔽用的图像的图像首标下找到面膜

该代码的逻辑: *以一个灰度图像,而没有阿尔法 *用给定的颜色创建一个纯色图像 *从给定的图像创建一个蒙版 *使用创建的蒙版蒙版实心图像 *输出是一个蒙面图像,同时也尊重(gr ay可能是浅红色的即)。

有没有人有一个想法如何解决这个功能? 如果你的XCode 8的Beta 3,您可以运行该代码,并在模拟器低于iOS的10,这将工作正确的,在iOS上10它将只创建一个方盒子

示例图片: Example image

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; 
} 
+0

这方面的进展如何?堆叠多个CALayers并使用蒙版时,我遇到类似的问题。你有没有向Apple提出申请? –

+0

是的,我们确实已经向苹果报告过。我们希望他们能够在下一个测试版中解决它,或者开始探索不同的选择(或希望有人有一个很好的解决方案) –

+0

我还没有在我的问题上取得任何进展。一个重现问题的示例项目不存在问题:-(。它像CALayer将图像数据量化为更少的位,因为它包含更多的子图层。 –

回答

0

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