3

次のようにコードを書いたとき..

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(context, kCGBlendModeDifference);

    sublayer = [CALayer layer];
    sublayer.backgroundColor = [UIColor redColor].CGColor;
    sublayer.opaque = NO;
    sublayer.frame = CGRectMake(30, 30, 250, 200);
    [sublayer renderInContext:context];

    sublayer1 = [CALayer layer];
    sublayer1.opaque = NO;
    sublayer1.backgroundColor = [UIColor greenColor].CGColor;
    sublayer1.frame = CGRectMake(120, 120, 100, 250);
    [sublayer1 renderInContext:context];

}

次の最初の画像のようになりました

ここに画像の説明を入力 ここに画像の説明を入力

サブレイヤー、サブレイヤー1の位置は、フレームを設定しているため、正しい方法ではありません。それらの交点が混色です。実際の位置が設定されていないのはなぜですか?

しかし、私addSublayerが使用すると、上の2番目の画像のようになりました。ここで、sublayer、sublayer1 の位置は正しい方法です。それらの交点は混色ではありません。何が起こったのですか?

サブレイヤーを作成した理由は、サブレイヤーをドラッグするときに、サブレイヤーの交差部分をブレンドカラーにする必要があるためです。誰か説明してください。

前もって感謝します。

4

1 に答える 1

1

コード内では次のようになります。最初のケースでは、ビューの基礎となるレイヤーのグラフィックス コンテキストでレイヤーを描画しただけです。それが drawRect の機能です。サブレイヤーを親レイヤー内に配置するだけなので、フレームの原点はそれに影響しません。ただし、ここでは、レイヤーが親レイヤーに追加されることはないため、原点はまったく何もせず、両方の形状が 0, 0 に表示されます。

2 番目のケースでは、まず以前とまったく同じことが起こりましたが、レイヤーをレイヤー階層に追加したため、指定された位置で、ビューの下位レイヤーの上に再度レンダリングされました。各サブレイヤーは独自のコンテキストでレンダリングされるため、drawRect で設定したブレンド モードはそれらに影響しません。

実際には、2 つの長方形の画像を取得したいだけであれば、サブレイヤーはまったく必要ありません。ビューの下層にある drawRect で直接描画できます。

- (void)drawRect:(CGRect)rect
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(ctx, kCGBlendModeDifference);

    CGContextSetFillColorWithColor(ctx, [UIColor redColor].CGColor);
    CGRect rect1 = CGRectMake(30, 30, 250, 200);
    CGContextFillRect(ctx, rect1);

    CGContextSetFillColorWithColor(ctx, [UIColor greenColor].CGColor);
    CGRect rect2 = CGRectMake(120, 120, 100, 250);
    CGContextFillRect(ctx, rect2);
}

編集(質問が編集されたため):

このアプローチを使用して、レイヤーを次のようにドラッグできます。

  • 上記のブレンドモードと描画コマンドを使用して、移動する各レイヤーの長方形を新しいレイヤーまたはその上のビューに描画します
  • 描画四角形に移動レイヤーの現在のフレームを使用します
  • 新しい最上層がタッチを受けないことを確認してください
  • インタラクティブレイヤーの位置が変更されるたびに、新しいレイヤーを再描画します
于 2012-07-09T19:03:52.770 に答える