2016-07-22 125 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中解決。