2016-07-22 3 views
1

В течение некоторого времени мы используем следующий код для маскировки изображения в градациях серого без прозрачности для цветного изображения.Ошибка маскирования изображений на iOS10 beta3

Это всегда работало нормально, пока Apple не выпустила iOS 10 beta 3. Внезапно маска больше не применяется, в результате чего возвращается квадратный квадрат с указанным цветом.

Логика этого можно найти на https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_images/dq_images.html

под заголовком маскирования изображения с изображением маски

Логика этого кода: * Возьмите изображение в оттенках серого без альфа * Создайте сплошное изображение с заданным цветом * Создайте маску с заданного изображения * Маска сплошное изображение с созданной маской * Вывод - изображение в масках с уважением к цветам между ними (gr ay может быть светло-красный, то есть).

У кого-нибудь есть идея, как исправить эту функцию? Если у вас есть XCode 8 Beta 3 вы можете запустить этот код и на тренажере ниже, чем прошивка 10 это будет работать правильно и прошивка 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

Да, мы уже сообщили об этом Apple. Мы надеемся, что они разрешат его в следующей бета-версии или начнут изучать различные варианты (или надеются, что у кого-то есть хорошее решение) –

+0

Я еще не достиг какого-либо прогресса в своей проблеме. Образец проекта для воспроизведения проблемы не имеет проблемы :-(. Его, как CALayer, квантует данные изображения на меньшее количество бит, поскольку он содержит больше дочерних слоев. –

ответ

0

Эта проблема была решена в iOS10 beta 4.