我有一个UIView子类,它呈现应用了蒙版的图像。它适用于所有设备(仅限iPad),除了具有宽色域显示屏(最新的iPad优点)的屏幕呈现完全透明(看起来像用户不喜欢的视图)的用户。有关初始化/ drawRect中的代码如下所示:CGImage蒙版在宽色域显示器上不起作用
init(image: UIImage) {
scratchable = image.cgImage!
imageWidth = scratchable.width
imageHeight = scratchable.height
let colorspace = CGColorSpaceCreateDeviceGray()
let pixels = CFDataCreateMutable(nil, imageWidth * imageHeight)!
alphaPixels = CGContext(
data: CFDataGetMutableBytePtr(pixels),
width: imageWidth,
height: imageHeight,
bitsPerComponent: 8,
bytesPerRow: imageWidth,
space: colorspace,
bitmapInfo: CGImageAlphaInfo.none.rawValue
)!
provider = CGDataProvider(data: pixels)!
alphaPixels.setFillColor(UIColor.black.cgColor)
let mask = CGImage(
maskWidth: imageWidth,
height: imageHeight,
bitsPerComponent: 8,
bitsPerPixel: 8,
bytesPerRow: imageWidth,
provider: provider,
decode: nil,
shouldInterpolate: false
)!
scratched = scratchable.masking(mask)!
super.init(frame: CGRect(x: 0, y: 0, width: imageWidth/2, height: imageHeight/2))
alphaPixels.fill(imageRect)
isOpaque = false
}
override func draw(_ rect: CGRect) {
let context = UIGraphicsGetCurrentContext()!
context.saveGState()
context.translateBy(x: 0, y: bounds.size.height)
context.scaleBy(x: 1.0, y: -1.0)
context.draw(scratched, in: rect)
context.restoreGState()
}
(为背景,原因pixels
,alphaPixels
等都是必要的是由于,吸引到右键影响面膜类的其他代码)。
任何想法为什么广色域显示会影响这一点,或者可以做些什么来解决它?我认为这可能与色彩空间有关,但文档明确指出,面具必须使用CGColorSpaceCreateDeviceGray
才能正常工作(的确如此)。
下面是一个示例项目演示该问题:讨论后http://d.pr/f/IS4SEF
这是iPhoneX上的问题吗(它也有广泛的色域)?它可以在模拟器中复制吗? – paiv
你能链接正确和错误的结果图像吗? – paiv
@paiv这是一款仅限iPad的应用程序,我们也没有iPhone X,所以不太确定。我认为这是行不通的。它不能在模拟器中复制,只能在设备上复制。我刚刚通过链接到示例项目编辑了我的问题。谢谢你的帮助! – pwightman