iPhone 7的Xcode 8 CoreGraphics问题(运行iOS 10)
我使用的是运行iOS 10的iPhone 7(无论是哪个版本的iOS 10,但它必须是iPhone 7设备……即使是使用相同版本iOS 10的iPhone 6s也没有这个问题)。不幸的是,我没有能力尝试运行iOS9或更低版本的iPhone7 在我的应用程序中,我使用此方法将一个图像屏蔽为另一个图像: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
- (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灰度值。因此,以我的气泡图标为例,黑色应该仍然是纯黑色,因为我希望图像的这一部分通过,但它周围的白色现在必须是透明的,因为我希望图像的这一部分被遮罩