Xcode 8 CoreGraphics问题与iPhone 7(运行iOS 10)

问题描述:

我正在使用运行iOS 10的iPhone 7(似乎不是哪个版本的iOS 10,但它必须是iPhone 7设备...即使是具有相同版本iOS 10的iPhone 6s也没有这个问题)。不幸的是,我没有能力尝试运行iOS 9或更低版本的iPhone 7。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或其他东西?也许有关iPhone 7的CoreGraphics与iPhone 6s不同(可能是因为iPhone 7的屏幕分辨率或处理能力等原因)?

我无法弄清楚接下来要做什么/看看,现在我知道这是一个Xcode问题。

到目前为止,我唯一的答案是跳过CGImageMaskCreateCGImageCreateWithMask,并利用UIViewmaskView属性与alpha蒙版图标。

换句话说,现在不是掩盖UIImage,并在屏幕上的某个CGRect帧绘制它,现在我这样做:

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

一个有关该方法的重要的一点是,maskView使用遮罩图标中像素的Alpha通道来确定要遮罩或通过的内容,而不是使用黑白图标中像素的0.0-1.0灰度值。因此,使用我的气泡图标作为例子,黑色应该仍然是纯黑的,因为我想让图像的这一部分通过,但现在它周围的白色必须透明,因为我希望图像的这一部分被遮罩。