0

レイヤーの 3 つの兄弟サブレイヤーをインスタンス化する UIView サブクラスがあります。サブレイヤーのうち 2 つは、コンテンツが画像ファイルに設定されています。3つ目はグラフィックが描かれています

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 

方法。問題は、描画レイヤーが常に画像レイヤーの背後に表示されることです。サブレイヤー配列の順序を変更し、サブレイヤーの zPosition プロパティを変更しようとしましたが、役に立ちませんでした。私は何が欠けていますか?

- (void)setupLayers
{
    CALayer *rootLayer = [self layer];

    _meterLayer = [CALayer layer];
    [_meterLayer setContents:(id)[[UIImage imageNamed:@"HealthMeterRadial60x60.png"] CGImage]];

    _pointerLayer = [CALayer layer];
    [_pointerLayer setContents:(id)[[UIImage imageNamed:@"HealthMeterRadialPointer60x60.png"] CGImage]];

    _labelLayer = [CALayer layer];
    [self set_labelText:@"Health"];

    [rootLayer addSublayer:_meterLayer];
    [rootLayer insertSublayer:_pointerLayer above:_meterLayer];
    [rootLayer insertSublayer:_labelLayer above:_pointerLayer];
}

そして drawLayerInContext メソッド:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    if( layer = _labelLayer) {
        //draw graphics ... omitted for clarity; works, but always behind images

    }
}
4

1 に答える 1

2

この問題の解決策は、_labelLayer のコンテンツを画像コンテキストに描画し、そのコンテンツ プロパティを結果の CGImage に設定することです。レイヤーを設定する場合:

//  create a layer for the name of the meter
_labelLayer = [CALayer layer];
[_labelLayer setFrame:CGRectMake(0, 0, rootLayer.frame.size.width, rootLayer.frame.size.height)];
[self set_labelText:@"Health"];
[_labelLayer setContents:(id)[[self labelImageContent] CGImage]];

次に、内容を CGImage に描画します。

- (UIImage *)labelImageContent {

NSAssert( _labelText != nil, @"No label set for radial meter");
//  get a frame for our layer and start a context to make an image
CGRect rect = _labelLayer.frame;
UIGraphicsBeginImageContext(rect.size);
CGContextRef ctx = UIGraphicsGetCurrentContext();

//  measure the size of our text first to know where to position
CGSize textsize = [_labelText sizeWithFont:[UIFont systemFontOfSize:10]];
const char *text = [_labelText cStringUsingEncoding:NSUTF8StringEncoding];
size_t textlen = strlen(text);

//  this is just a testing rectangle
CGContextSetRGBFillColor(ctx, 1, 0, 0, 0.5);
CGContextFillRect(ctx,rect);

/*  save our context before writing text  */
CGContextSaveGState(ctx);

CGContextSelectFont(ctx, "Helvetica", 9, kCGEncodingMacRoman);
CGContextSetTextDrawingMode(ctx, kCGTextFill);

/*  this will flip our text so that it is readable  */
CGAffineTransform flipTransform = CGAffineTransformMakeTranslation(0.0f, rect.size.height);
flipTransform = CGAffineTransformScale(flipTransform, 1.0f, -1.0f);

//  write our title in black
float opaqueBlack[] = {0,0,0,1};
CGContextSetFillColor(ctx, opaqueBlack);
CGContextConcatCTM(ctx, flipTransform);
CGContextShowTextAtPoint(ctx, rect.origin.x + 0.5*(60-textsize.width), rect.origin.y + 40 - 0.5 * textsize.height - 5, text, textlen);

/*  get our graphics state back  */
CGContextRestoreGState(ctx);

UIImage *labelPic = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return labelPic;

}

df

于 2009-09-06T15:58:01.703 に答える