Mam podklasę UIView, która renderuje obraz z zastosowaną maską. Działa doskonale na wszystkich urządzeniach (tylko iPad), z wyjątkiem tych z ekranem Wide Color Gamut (najnowszy iPad Pros), w którym maska jest całkowicie przezroczysta (wygląda na to, że użytkownik nie ma widoku). Odpowiedni startowych/code drawRect wygląda następująco:Maska CGImage nie działa na wyświetlaczach Wide Color Gamut
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()
}
(Dla kontekstu, przyczyny pixels
, alphaPixels
itp są konieczne ze względu na inny kod w klasie, która wciąga w kontekście wpływu na maskę).
Każdy pomysł, dlaczego szeroki zakres wyświetlania kolorów wpłynie na to, lub co można zrobić, aby to naprawić? Pomyślałem, że może to mieć coś wspólnego z przestrzenią kolorów, ale doktorzy jasno stwierdzają, że maski muszą używać CGColorSpaceCreateDeviceGray
, aby działała prawidłowo (co jest prawdą).
Oto przykładowy projekt wykazania problem: http://d.pr/f/IS4SEF
Czy to problem na iPhoneX (ma również szeroką gamę kolorów)? Czy można go odtworzyć w symulatorze? – paiv
Czy możesz połączyć dobre i złe obrazy wyników? – paiv
@paiv To aplikacja przeznaczona tylko dla iPada, a także nie mamy iPhone'a X, więc nie jestem pewien. Zakładam, że to nie zadziała. Nie można go odtworzyć w symulatorze, tylko w urządzeniu. Właśnie zredagowałem moje pytanie z linkiem do przykładowego projektu. Dzięki za pomoc! – pwightman