1

iOSでは、UITableViewCellのレイヤーにCALayerを追加しています。CALayerを使用するのはこれが初めてで、テーブルセルの背景色を変更するだけです。私の目標は、(1)CALayerの使用方法を学習し、(2)Instrumentsを使用して、描画が現在の実装よりも高速で、CGContextFillRectの速度が低下するかどうかをテストすることです。

技術的なQ&A QA1708は、これらすべてのきっかけとなりました。)

現在の実装(動作)

- (void)drawRect:(CGRect)r
{
    UIColor *myColor = [self someColor];
    [myColor set];
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextFillRect(context, r);  // draw the background color
    // now draw everything else
    // [...]

}

新しい実装を試みました(機能しません)

#import <QuartzCore/QuartzCore.h>

@implementation MyCell {
    CALayer *backgroundLayer;
}

- (id) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

    if (self) {
        // [...other stuff here too]
        backgroundLayer = [[CALayer alloc] init];
        [[self layer] addSublayer:backgroundLayer];
    }

    return self;
}

- (void)drawRect:(CGRect)r {
    backgroundLayer.frame = CGRectMake(0, 0, r.size.width, r.size.height);
    [backgroundLayer setBackgroundColor:[self someColor]];
    // now draw everything else
    // [...]
}

正しい色が表示されますが、他の描画は表示されません(カスタム描画が新しいレイヤーの 背後にあると想定しています)。

線を削除するbackgroundLayer.frame = ...と、他のすべての描画はまだそこにありますが、背景は黒です。

私は何が欠けていますか?

4

1 に答える 1

3

予期しない動作が発生する理由は、UITableViewCellの比較的複雑なビュー階層が原因です。

- UITableViewCell
   - contentView
   - backgroundView
   - selectedBackgroundView

でカスタム描画ルーチンを定義するときは常に、階層UITableViewCell内で定義する必要があります。contentViewこれには、サブクラス化UIView、オーバーライド-drawRect:、およびサブビューとしての追加が含まれcontentViewます。

例で背景色が無視されていた理由はCALayer、のレイヤーのサブレイヤーとしてを追加したためUITableViewCellです。これはUITableViewCell'sによって隠されていcontentViewます。

ただし、何らかの理由で、ここを使用したいとしCALayerます。持っていないものがないのに、なぜか理解したいUIViewです。このラウンドアバウトの一連のことを行う代わりに、を設定することができbackgroundColorます。contentView

CALayerリクエストどおりに使用する例を次に示します。

@implementation JRTableViewCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
   self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
   if(self) {
      [self addCustomLayerToContentView];
   }
   return self;
}

- (void)addCustomLayerToContentView {
   CALayer *layer = [[CALayer alloc] initWithFrame:[self bounds]];  
   [layer setBackgroundColor:[[UIColor blueColor] cgColor]]; //use whatever color you wish.

   [self.contentView.layer addSublayer:layer];
}

@end
于 2013-03-05T02:43:21.143 に答える