Как заставить CGImageMaskCreate работать на 3,5-дюймовых устройствах?
Вот вопрос к очень опытному разработчику iOS.
Функция Core Graphics CGImageMaskCreate создает маску изображения CG из изображения в градациях серого. Я использую JPG, экспортированный в оттенках серого. Я дважды проверил: при открытии в Photoshop, перейдя в Image > Mode > он говорит: "Оттенки серого".
Следующий метод является частью категории UIImage. Он принимает маску UIImage (просто изображение в градациях серого в формате JPG), и его цель - замаскировать себя (UIImage, который представляет собой фотографию JPG), чтобы полученное изображение было прозрачным.
Он работает на всех 4-дюймовых устройствах и на iPad 4. Но выход CGImageMaskCreate не работает на любом 3,5-дюймовом устройстве с iOS 6 или iOS 7. То есть полученное изображение прозрачно на 100%. То же самое в симуляторе iPhone 3,5 дюйма (Xcode 5). Понятия не имею почему. Некоторые люди говорят, что это проблема iOS 7, но она работает на iPhone 5 и 5S с iOS 7. Я также пробовал оттенки серого PNG-8 с тем же результатом.
Есть известный TN от Apple или обходной путь к этой ошибке?
- (UIImage*)maskedImageWithMask:(UIImage *)maskImage {
CGImageRef imageRef = self.CGImage;
CGImageRef maskRef = maskImage.CGImage;
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBytesPerRow(maskRef),
CGImageGetDataProvider(maskRef), NULL, NO);
CGImageRef maskedImageRef = CGImageCreateWithMask(imageRef, mask);
UIImage *maskedImage = [UIImage imageWithCGImage:maskedImageRef scale:self.scale orientation:self.imageOrientation];
CGImageRelease(mask);
CGImageRelease(maskedImageRef);
return maskedImage;
}
Редактировать:
На 3,5-дюймовом симуляторе iPhone и устройствах CGImageIsMask(mask) возвращает NO. На 4-дюймовом симуляторе и устройствах он возвращает ДА. Поэтому CGImageMaskCreate определенно иногда не создает маски.