2017-02-02 5 views
0

放射状のグラデーションマスクを作成して、写真を見ることができるように画像に穴を作りたい。私は穴を重ね合わせた画像を作成し、画像は下に以下のような、目に見える:ラジアルグラデーションマスクを作成して画像内に穴を作成する

enter image description here

は、私は正常CGImageMaskCreate()を使用して、この画像を作成することができています。しかし、iOS 10.0のCGImageMaskCreate()の異常な動作のために、私は別の解決策を探しています。

このような解決策の1つは、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]; 

この私が取得しています結果:

enter image description here

を使用した画像が完全に赤い色で満たされています。結果の画像をグラデーション領域で透明にして、その中を通るようにして、残った領域を他の画像の不透明度を赤色にしたいと思っています。

maskViewプロパティを使用してこのエフェクトを作成したいのですが、これは、iOS 10以降で発生するCAShapeLayerCGImageMaskCreate()の異常な動作です。

どのような提案も非常に役に立ちます。 ありがとうございます。私は何を記述しているが、このようなものだと思います

+0

"iOS 10以降で発生するCAShapeLayerとCGImageMaskCreate()の異常な動作"あなたはどういう意味ですか? – matt

+0

CGImageMaskCreate()を使用すると、マスクは正しく作成されますが、最終的なマスクされたイメージはほぼ透明になります。私のアプリケーションでは、この問題はiPhone 7以上でのみ発生します。私はそれがiOS 10のいくつかの問題のためだと思う。 – maven25

+0

ところで、私はこのスレッドからいくつかの助けを得たhttps://forums.developer.apple.com/thread/50854 – maven25

答えて

0

:あなたが見ることができるように

enter image description here

、私は黄色の背景を表示するようにできるように、画像ビューでラジアル勾配の穴をパンチしましたスルー。

どうしたのですか?画像ビューのmaskとして使用されるCIFilter("CIRadialGradient")です。

+0

_your_コードの問題は、グラデーションにクリアセンタがないことです。透明なセンターから黒い外に退色するのではなく、黒のセンターから透明な外に退色します。実際、あなたのカラー配列 'components'は後方にあります - それだけです。これを修正すれば、コードは正常に動作します。私はおそらくそれをやる方法ですが、あなたのやり方はより正確なコントロールを提供しますので、すぐに行き、あなたのやり方をしてください。 – matt

関連する問題