我想创建一个径向渐变蒙版,在图片中创建一个洞,以便您可以看到图片。我创建了一个带孔的重叠图像,下方的图像可见,如下所示:
我可以成功使用CGImageMaskCreate()
创建此图片。但由于iOS 10.0中CGImageMaskCreate()
的异常行为,我正在寻找其他解决方案。
一个这样的解决方案是使用UIView的maskView
属性创建图像蒙版。我可以使用maskView
编写用于创建上述图像效果的代码。但它没有给出正确的结果。
我对Core Graphics不太满意,也许这就是为什么我无法弄清楚我哪里出错了。我的代码是:
CGRect rect = CGRectMake(0.0, 0.0, self.view.bounds.size.width, self.view.bounds.size.height);
CGSize size = self.view.bounds.size;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGFloat radius = 160.0;
CGPoint center = CGPointMake(150.0, 150.0);
CGFloat components[] = {1.0,1.0,1.0,1.0, 1.0,1.0,1.0,1.0, 1.0,1.0,1.0,1.0, 1.0,1.0,1.0,1.0, 1.0,1.0,1.0,0.5, 1.0,1.0,1.0,0.0};
CGFloat locations[] = {0.0, 0.1, 0.2, 0.8, 0.9, 1.0};
//creating bitmap context
CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height, 8, size.width*4, colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrder32Big);
//creating gradient
CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, components, locations, 6);
CGContextDrawRadialGradient(context, gradient, center, 0.1, center, radius, 0);
//get the gradient image
CGImageRef imageHole = CGBitmapContextCreateImage(context);
UIImage *img = [UIImage imageWithCGImage:imageHole];
CGGradientRelease(gradient);
//creating mask view whose alpha channels will be used for masking
UIImageView *maskImgView = [[UIImageView alloc] initWithFrame:CGRectMake(50.0, 50.0, 100.0, 100.0)];
[maskImgView setImage:img];
//This is the view on which I want to perform masking
UIImageView *mainView = [[UIImageView alloc] initWithFrame:self.view.bounds];
[mainView setImage:[UIImage imageNamed:@"insta-logo.png"]];
mainView.maskView = maskImgView;
[self.view addSubview:mainView];
这是我得到的结果:
使用的图像完全用红色填充。我希望生成的图像在渐变区域中是透明的,这样你就可以通过它,我希望区域的其余部分为红色,保留图像其余部分的不透明度,就像我发布的第一张图片一样。
我想使用maskView
属性创建此效果,因为iOS 10及更高版本中遇到CAShapeLayer
和CGImageMaskCreate()
的异常行为。
任何建议都会非常有帮助。 谢谢。