2009-11-23 72 views
3

我想绘制具有分组样式的UITableViewCell的背景。我的问题是我无法拨打-(void)drawRect:(CGRect)rect,或者我认为应该以编程方式调用...使用改变颜色和分隔符的颜色和宽度为tableview(uitableview)绘制自定义单元格

我从以下链接获取了代码。

How to customize the background/border colors of a grouped table view cell?

// 
// CustomCellBackgroundView.h 
// 
// Created by Mike Akers on 11/21/08. 
// Copyright 2008 __MyCompanyName__. All rights reserved. 
// 

#import <UIKit/UIKit.h> 

typedef enum { 
    CustomCellBackgroundViewPositionTop, 
    CustomCellBackgroundViewPositionMiddle, 
    CustomCellBackgroundViewPositionBottom, 
    CustomCellBackgroundViewPositionSingle 
} CustomCellBackgroundViewPosition; 

@interface CustomCellBackgroundView : UIView { 
    UIColor *borderColor; 
    UIColor *fillColor; 
    CustomCellBackgroundViewPosition position; 
} 

    @property(nonatomic, retain) UIColor *borderColor, *fillColor; 
    @property(nonatomic) CustomCellBackgroundViewPosition position; 
@end 

// 
// CustomCellBackgroundView.m 
// 
// Created by Mike Akers on 11/21/08. 
// Copyright 2008 __MyCompanyName__. All rights reserved. 
// 

#import "CustomCellBackgroundView.h" 

static void addRoundedRectToPath(CGContextRef context, CGRect rect, 
           float ovalWidth,float  ovalHeight); 

@implementation CustomCellBackgroundView 
@synthesize borderColor, fillColor, position; 

- (BOOL) isOpaque { 
    return NO; 
} 

- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     // Initialization code 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 
    // Drawing code 
    CGContextRef c = UIGraphicsGetCurrentContext(); 
CGContextSetFillColorWithColor(c, [fillColor CGColor]); 
CGContextSetStrokeColorWithColor(c, [borderColor CGColor]); 
CGContextSetLineWidth(c, 2.0); 

if (position == CustomCellBackgroundViewPositionTop) { 

    CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ; 
    CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ; 
    minx = minx + 1; 
    miny = miny + 1; 

    maxx = maxx - 1; 
    maxy = maxy ; 

    CGContextMoveToPoint(c, minx, maxy); 
    CGContextAddArcToPoint(c, minx, miny, midx, miny, ROUND_SIZE); 
    CGContextAddArcToPoint(c, maxx, miny, maxx, maxy, ROUND_SIZE); 
    CGContextAddLineToPoint(c, maxx, maxy); 

    // Close the path 
    CGContextClosePath(c); 
    // Fill & stroke the path 
    CGContextDrawPath(c, kCGPathFillStroke);     
    return; 
} 

else if (position == CustomCellBackgroundViewPositionBottom) { 

    CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ; 
    CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ; 
    minx = minx + 1; 
    miny = miny ; 

    maxx = maxx - 1; 
    maxy = maxy - 1; 

    CGContextMoveToPoint(c, minx, miny); 
    CGContextAddArcToPoint(c, minx, maxy, midx, maxy, ROUND_SIZE); 
    CGContextAddArcToPoint(c, maxx, maxy, maxx, miny, ROUND_SIZE); 
    CGContextAddLineToPoint(c, maxx, miny); 
    // Close the path 
    CGContextClosePath(c); 
    // Fill & stroke the path 
    CGContextDrawPath(c, kCGPathFillStroke);   
    return; 
} 
else if (position == CustomCellBackgroundViewPositionMiddle) { 
    CGFloat minx = CGRectGetMinX(rect) , maxx = CGRectGetMaxX(rect) ; 
    CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ; 
    minx = minx + 1; 
    miny = miny ; 

    maxx = maxx - 1; 
    maxy = maxy ; 

    CGContextMoveToPoint(c, minx, miny); 
    CGContextAddLineToPoint(c, maxx, miny); 
    CGContextAddLineToPoint(c, maxx, maxy); 
    CGContextAddLineToPoint(c, minx, maxy); 

    CGContextClosePath(c); 
    // Fill & stroke the path 
    CGContextDrawPath(c, kCGPathFillStroke);   
    return; 
} 

else if (position == CustomCellBackgroundViewPositionSingle) 
{ 
    CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ; 
    CGFloat miny = CGRectGetMinY(rect) , midy = CGRectGetMidY(rect) , maxy = CGRectGetMaxY(rect) ; 
    minx = minx + 1; 
    miny = miny + 1; 

    maxx = maxx - 1; 
    maxy = maxy - 1; 

    CGContextMoveToPoint(c, minx, midy); 
    CGContextAddArcToPoint(c, minx, miny, midx, miny, ROUND_SIZE); 
    CGContextAddArcToPoint(c, maxx, miny, maxx, midy, ROUND_SIZE); 
    CGContextAddArcToPoint(c, maxx, maxy, midx, maxy, ROUND_SIZE); 
    CGContextAddArcToPoint(c, minx, maxy, minx, midy, ROUND_SIZE); 

    // Close the path 
    CGContextClosePath(c); 
    // Fill & stroke the path 
    CGContextDrawPath(c, kCGPathFillStroke);     
    return;   
} 


} 


- (void)dealloc { 
    [borderColor release]; 
    [fillColor release]; 
    [super dealloc]; 
} 


@end 

static void addRoundedRectToPath(CGContextRef context, CGRect rect, 
           float ovalWidth,float  ovalHeight) 

{ 
    float fw, fh; 

    if (ovalWidth == 0 || ovalHeight == 0) {// 1 
     CGContextAddRect(context, rect); 
     return; 
    } 

    CGContextSaveGState(context);// 2 

    CGContextTranslateCTM (context, CGRectGetMinX(rect),// 3 
          CGRectGetMinY(rect)); 
    CGContextScaleCTM (context, ovalWidth, ovalHeight);// 4 
    fw = CGRectGetWidth (rect)/ovalWidth;// 5 
    fh = CGRectGetHeight (rect)/ovalHeight;// 6 

    CGContextMoveToPoint(context, fw, fh/2); // 7 
    CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1);// 8 
    CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1);// 9 
    CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1);// 10 
    CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1); // 11 
    CGContextClosePath(context);// 12 

    CGContextRestoreGState(context);// 13 
} 

但问题是我的drawRect是没有得到自动调用.........

我这样做是这样的。

CustomCellBackgroundView *custView = [[CustomCellBackgroundView alloc]  initWithFrame:CGRectMake(0,0,320,44)]; 
[cell setBackgroundView:custView]; 
[custView release]; 

并且这样做给了我透明的单元格。 我尝试过与代码打架,但可以得到任何结果。请帮助我。我真的不知道这个代码将如何运行。

回答

2

嗨,大家好,

我有这个代码工作....

只是做这个.....

在CustomCellBackGroundView

- (BOOL) isOpaque { 
    return NO; 
} 



- (id)initWithFrame:(CGRect)frame{ 
    if (self = [super initWithFrame:frame]) { 
     [self setFillColor:[UIColor colorWithRed:0.07 green:.23 blue:.48 alpha:0.5]]; 
     [self setBorderColor:[UIColor colorWithRed:0.8 green:0.8 blue:1.0 alpha:0.5]]; 
     [self setClearsContextBeforeDrawing:YES]; 
    } 
    return self; 
} 

- (void)setNeedsDisplay{ 
    [self setNeedsDisplayInRect:self.frame]; 
} 

和UR的UITableViewController班只是做这个.....

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    static NSString *MyIdentifier = @"My Identifier"; 
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 
    if(cell==nil){ 

     cell = [self reuseTableViewCellWithIdentifier:MyIdentifier indexPath:indexPath]; 

     [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; 

     [cell setSelectionStyle:UITableViewCellSelectionStyleGray]; 
    } 

    CustomCellBackgroundView *custview = [[CustomCellBackgroundView alloc] initWithFrame:CGRectMake(0, 0, 320, 35)]; 

    if(([tbleView numberOfRowsInSection:indexPath.section]-1) == 0){ 
     custview.position = CustomCellBackgroundViewPositionTop; 
    } 
    else if(indexPath.row == 0){ 
     custview.position = CustomCellBackgroundViewPositionTop; 
    } 
    else if (indexPath.row == ([tbleView numberOfRowsInSection:indexPath.section]-1)){ 
     custview.position = CustomCellBackgroundViewPositionBottom; 
    } 
    else{ 
     custview.position = CustomCellBackgroundViewPositionMiddle; 
    } 
    [cell setBackgroundView:custview]; 
    [custview release]; 


    UILabel *lbl = (UILabel *)[cell.contentView viewWithTag:101]; 



     [lbl setText:@"Hurray and thanks to all folks"]; 

    //[cell setNeedsDisplay]; 
    return cell; 
} 

remeber不要在

How to customize the background/border colors of a grouped table view cell?

2

如果你是针对iPhone OS 3.0+,所有你需要做的是这样的:

cell.backgroundColor = [UIColor redColor]; 

代任何的UIColor你真正想要的,当然。背景颜色将自动剪切到分组表格视图单元格的圆角矩形边界。

+0

我不是针对3.0+这是我必须去与代码 – 2009-11-25 05:28:15

0

我有Sbrocket同意这样做的(细胞==零)块,并特别感谢所有的人。

您需要两行代码。如果要为行分隔符和边框使用自定义颜色,请使用四行。

// For cell background 
cell.backgroundColor=[UIColor lightGrayColor]; 

// For tableView line separator (assuming IBOutlet UITableView* table;) 
self.table.separatorColor=[UIColor redColor]; 

//If you need a custom color (I assume you do), then... 
cell.backgroundColor=[UIColor colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha]; 

对于单元格背景和行分隔符中的任何颜色,都放入RGB值。

不可能更容易。

+0

请尝试在2.x做到这一点,并保持tableStyle分组,然后看你的是更容易或不... ...) – 2009-11-25 05:27:00

+0

为什么在世界上你想开发和维护2.x代码? – Jordan 2009-11-25 13:25:15

+1

您正在汲取所有的开发头痛,而不是将升级负担转移给用户。这是作为开发人员花费你的钱。很坏。客户机/服务器开发的部分问题。 Chrome操作系统规则! ;) – Jordan 2009-11-25 13:28:37

相关问题