2016-12-14 4 views
1

Я использую iPhone 7 под управлением iOS 10 (кажется, не имеет значения, какая версия iOS 10, но она должна быть устройством iPhone 7 ... даже iPhone 6 с той же версией iOS 10 не имеет этой проблемы). К сожалению, у меня нет возможности попробовать iPhone 7 под управлением iOS 9 или ниже.Проблема с Xcode 8 CoreGraphics с iPhone 7 (работает под управлением iOS 10)

В моем приложении, я использую этот метод, чтобы замаскировать изображение с другим изображением:

- (UIImage *)imageWithMask:(UIImage *)maskImage 
{ 
    UIImage *returnImage = nil; 

    CGImageRef maskRef = maskImage.CGImage; 
    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
             CGImageGetHeight(maskRef), 
             CGImageGetBitsPerComponent(maskRef), 
             CGImageGetBitsPerPixel(maskRef), 
             CGImageGetBytesPerRow(maskRef), 
             CGImageGetDataProvider(maskRef), 
             NULL, 
             false); 

    CGImageRef maskedImageRef = CGImageCreateWithMask([self CGImage], mask); 

    returnImage = [UIImage imageWithCGImage:maskedImageRef]; 

    CGImageRelease(mask); 
    CGImageRelease(maskedImageRef); 

    return returnImage; 
} 

Вот изображение маски я прохожу (черно-белый):

Mask Image

Если я построить мое приложение с Xcode 7.3.1, мой метод маскирует изображения прекрасно:

Xcode 7 build

Однако, если я запустить приложение в Xcode 8 (даже последние 8,2), мой метод приводит к тому, результирующее изображение выглядеть прозрачным (белый фон проступает):

Xcode 8 build

Я не понять, что происходит и почему разные версии Xcode будут вызывать это (и почему это происходит только на iPhone 7). Может быть, разные версии Xcode занимаются разными версиями CoreGraphics или чем-то еще? Возможно, что-то о CoreGraphics с iPhone 7 отличается от iPhone 6s (возможно, из-за разрешения экрана iPhone или возможностей обработки или чего-то еще)?

У меня возникли проблемы с выяснением того, что попробовать/заглянуть в следующий, теперь, когда я знаю, что это проблема Xcode.

ответ

0

До сих пор, единственный ответ, у меня есть, чтобы пропустить CGImageMaskCreate и CGImageCreateWithMask вообще и использовать UIView «s maskView свойство со значком альфа-маски.

Другими словами, теперь вместо маскировки UIImage и рисунок его в определенном CGRect кадре на экране, теперь я это делаю:

imageView = [[UIImageView alloc] initWithFrame:frame]; 
imageView.image = imageToMask; 
imageView.maskView = [[UIImageView alloc] initWithImage:alphaMaskIcon]; 
[view addSubview:imageView]; 

Одно важное замечание об этом методе является то, что maskView использует альфа-каналы пикселей в значке маскирования, чтобы определить, что нужно маскировать или пропускать, вместо того, чтобы использовать значение полутоновой шкалы 0.0-1.0 пикселей в черно-белом значке. Итак, используя значок моего пузыря в качестве примера, черный цвет должен быть сплошным черным, потому что я хочу, чтобы часть изображения прошла, но белый вокруг него теперь должен быть прозрачным, потому что я хочу, чтобы часть изображения была замаскирована ,