В течение некоторого времени мы используем следующий код для маскировки изображения в градациях серого без прозрачности для цветного изображения.Ошибка маскирования изображений на 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 это будет просто создать квадратную коробку
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;
}
Прогресс на этом? У меня аналогичная проблема при укладке нескольких CALayers и использовании масок. Вы делали с Apple? –
Да, мы уже сообщили об этом Apple. Мы надеемся, что они разрешат его в следующей бета-версии или начнут изучать различные варианты (или надеются, что у кого-то есть хорошее решение) –
Я еще не достиг какого-либо прогресса в своей проблеме. Образец проекта для воспроизведения проблемы не имеет проблемы :-(. Его, как CALayer, квантует данные изображения на меньшее количество бит, поскольку он содержит больше дочерних слоев. –