2

別のタイプのテーマでUITableViewCellビューを更新しようとしています。いくつかのテーマがありますが、正しく機能させることができません。

@interface CustomRowBackground : UIView {
CGColorRef topStroke;
CGColorRef lightColor;
CGColorRef darkColor;
CGColorRef bottomStroke; //also known as separator
CGColorRef borderColor;
}

- (id)initWithFrame:(CGRect)frame topStroke:(CGColorRef)top lightColor:(CGColorRef)light   darkColor:(CGColorRef)dark bottomStroke:(CGColorRef)bottom borderColor:(CGColorRef)border;
@end

- (id)initWithFrame:(CGRect)frame topStroke:(CGColorRef)top lightColor:(CGColorRef)light    darkColor:(CGColorRef)dark bottomStroke:(CGColorRef)bottom borderColor:(CGColorRef)border
{
   self = [super initWithFrame:frame];
if (self) {
    // Initialization code
    topStroke = top;
    lightColor = light;
    darkColor = dark;
    bottomStroke = bottom;
    borderColor = border;



}
return self;
}

UIViewControllerの.hファイルで、ヘルパーメソッドを使用してUIColorクラスを拡張します。

@interface UIColor (BIExtras)
+(UIColor *)colorWithR:(CGFloat)red G:(CGFloat)green B:(CGFloat)blue A:(CGFloat)alpha;
@end

それから.mで私はこれを書きます

@implementation UIColor (BIExtras)
+(UIColor *)colorWithR:(CGFloat)red G:(CGFloat)green B:(CGFloat)blue A:(CGFloat)alpha {
return [UIColor colorWithRed:(red/255.0) green:(green/255.0) blue:(blue/255.0) alpha:alpha];    
}
@end

次に、特定の行に対して必要なグラデーションを設定しようとします。

TaskDisplayCell *cell = (TaskDisplayCell *)[self.tableView dequeueReusableCellWithIdentifier:TaskCellIdentifier];
if (indexPath.row == 0) {
    cell.backgroundView = [[CustomRowBackground alloc]  initWithFrame:CGRectMake(0,0,self.tableView.bounds.size.width,40) 
topStroke:[UIColor colorWithR:119 G:119 B:119 A:1].CGColor 
lightColor:[UIColor colorWithR:92 G:92 B:92 A:1].CGColor 
darkColor:[UIColor colorWithR:70 G:70 B:70 A:1].CGColor 
bottomStroke:[UIColor colorWithR:76 G:76 B:76 A:1].CGColor 
borderColor:[UIColor colorWithR:110 G:110 B:110 A:1].CGColor]; 
}

注:これがその方法かどうかはわかりません。別のグラデーションテーマで背景を初期化したいだけです。

とにかく、それは私にエラーを与えます。drawRectに[UIColorcolorWith]メソッドの割り当てを手動で書き込むと、それは機能します。代わりにコードの再利用を許可すると、クラッシュします。

何か案は?

ベン

4

1 に答える 1

0

私があなたのプログラムで見ている問題の1つは、あなたがあなたCGColorRefのメモリ管理を実行していないということです-ARC(あなたがそれを有効にしていると仮定して)はあなたのために非ObjCオブジェクトを管理しません。これらは手動で保持および解放する必要があります。したがって、ARCとMRCの両方で、これらを手動で保持および解放する必要があります。

これが基本的な形式です。

@interface CustomRowBackground : UIView {
    CGColorRef color;
}

- (id)initWithFrame:(CGRect)frame color:(CGColorRef)pColor;

@end

- (id)initWithFrame:(CGRect)frame color:(CGColorRef)pColor
{
    self = [super initWithFrame:frame];
    if (self) {
        color = CGColorRetain(pColor);
    }
    return self;
}

- (void)dealloc
{
    CGColorRelease(color), color = 0;
// [super dealloc]; if MRC
}

- (CGColorRef)color
{
    return color;
}

- (void)setColor:(CGColorRef)p
{
    if (color == p) {
        return;
    }
    CGColorRef prev = color;
    color = CGColorRetain(p);
    CGColorRelease(prev);
}
于 2012-08-25T16:03:12.183 に答える