Palimondoのこのサンプル コードを使用しています。これは、CAGradientLayer を CAShapeLayers にマスクする方法を学習する素晴らしいコードです。出力は次のとおりです。
今、私はこのイメージを作成しようとしています:
PaintCode を使用して、すべての UIBezierPath とグラデーション カラーを取得して停止し、それらを複数の配列に配置し、基本的にそれぞれを反復して新しい CAShapeLayer と CAGradientLayer に追加することができました。
- (void)viewDidLoad
{
[super viewDidLoad];
[self blackPaths];
[self setupGradients];
int count = 0;
for (CAGradientLayer *gradientLayerItem in _individualGradientArrays) {
CAShapeLayer *gradientMask = [CAShapeLayer layer];
gradientMask.fillColor = [[UIColor clearColor] CGColor];
gradientMask.strokeColor = [[UIColor blackColor] CGColor];
gradientMask.lineWidth = 4;
gradientMask.frame = CGRectMake(0, 0, _testView.bounds.size.width, _testView.bounds.size.height);
//
// CGMutablePathRef t = CGPathCreateMutable();
// CGPathMoveToPoint(t, NULL, 0, 0);
// CGPathAddLineToPoint(t, NULL, _testView.bounds.size.width, _testView.bounds.size.height);
gradientMask.path = [[_UIBezierPathsArray objectAtIndex:count]CGPath];
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.locations = gradientLayerItem.locations;
gradientLayer.startPoint = CGPointMake(0.5,1.0);
gradientLayer.endPoint = CGPointMake(1.0,0.5);
gradientLayer.frame = CGRectMake(0, 0, _testView.bounds.size.width, _testView.bounds.size.height);
// NSMutableArray *colors = [NSMutableArray array];
// for (int i = 0; i < 3; i++) {
// [colors addObject:(id)[[UIColor colorWithHue:(0.2 * i) saturation:1 brightness:.8 alpha:1] CGColor]];
// }
gradientLayer.colors = gradientLayerItem.colors;
[gradientLayer setMask:gradientMask];
[_testView.layer addSublayer:gradientLayer];
count++;
}
[_testView setNeedsDisplay];
目標は、CoreAnimation を使用してアニメーション化できる 16 個の個別の CAGradientLayer を用意して、一種の「渦巻き」効果を作成することです (PaintCode からの出力を drawRect に配置するだけで機能しますが、問題は、色またはグラデーションをレイヤーに配置するよりも、CoreGraphics を介してアニメーション化する方がはるかに困難です)。
そして、これが出力されます:
[UIColor clearColor]
数百回の反復の後、この時点の前に、 for を交換しようとしましたwhiteColor
(これはサンプル コードが必要とするものではありません)。これが出力されます。
グラデーションが 2 つしかないことがわかりますが、それがwhiteColor
CAGradientLayer に干渉していると私は信じています。
非常に微妙な何かを見逃しているに違いないことはわかっていますが、それが見えないようです。
サンプル コードではclearColor
、グラデーションを適切に使用clearColor
して表示できるのに、CAShapeLayer にアタッチされた UIBezierPath を使用するとグラデーションが壊れるのはなぜですか?
友人は、別の解決策は、グラデーションの 3 つの円を持ち、基本的にそれらをマスクされた形状上で同心円状に回転させて錯覚を作成することだと言いましたが、どうすればそれができるのか途方に暮れています。