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

iPhone 7的Xcode 8 CoreGraphics问题(运行iOS 10),iphone,xcode7,core-graphics,xcode8,ios10,Iphone,Xcode7,Core Graphics,Xcode8,Ios10,我使用的是运行iOS 10的iPhone 7(无论是哪个版本的iOS 10,但它必须是iPhone 7设备……即使是使用相同版本iOS 10的iPhone 6s也没有这个问题)。不幸的是,我没有能力尝试运行iOS9或更低版本的iPhone7 在我的应用程序中,我使用此方法将一个图像屏蔽为另一个图像: - (UIImage *)imageWithMask:(UIImage *)maskImage { UIImage *returnImage = nil; CGImageRef m

我使用的是运行iOS 10的iPhone 7(无论是哪个版本的iOS 10,但它必须是iPhone 7设备……即使是使用相同版本iOS 10的iPhone 6s也没有这个问题)。不幸的是,我没有能力尝试运行iOS9或更低版本的iPhone7

在我的应用程序中,我使用此方法将一个图像屏蔽为另一个图像:

- (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;
}
这是我正在传递的蒙版图像(黑白):

如果我使用Xcode 7.3.1构建应用程序,我的方法会很好地屏蔽图像:

但是,如果我在Xcode 8(甚至是最新的8.2)中运行应用程序,我的方法会使生成的图像看起来透明(白色背景通过):

我不明白到底发生了什么,为什么不同版本的Xcode会导致这种情况(以及为什么这种情况只发生在iPhone7上)。也许不同版本的Xcode引入了不同版本的CoreGraphics或其他东西?也许iPhone 7的CoreGraphics与iPhone 6s有所不同(可能是因为iPhone 7的屏幕分辨率或处理能力或其他原因)


现在我知道这是一个Xcode问题,我很难确定下一步要尝试/研究什么。

到目前为止,我唯一的答案是跳过
cImageMaskCreate
cImageCreateWithMask
并使用
UIView
maskView
属性和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灰度值。因此,以我的气泡图标为例,黑色应该仍然是纯黑色,因为我希望图像的该部分通过,但它周围的白色现在必须是透明的,因为我希望图像的该部分被遮罩。

到目前为止,我唯一的答案是跳过
CGImageMaskCreate
CGImageCreateWithMask
,使用
UIView
maskView
属性和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灰度值。因此,以我的气泡图标为例,黑色应该仍然是纯黑色,因为我希望图像的这一部分通过,但它周围的白色现在必须是透明的,因为我希望图像的这一部分被遮罩