为tableview(uitableview)绘制一个自定义单元格,更改颜色和分隔符的颜色和宽度

我想绘制具有分组样式的UITableViewCell的背景。 我的问题是我无法调用-(void)drawRect:(CGRect)rect或者我认为它应该以编程方式调用…

我已经从以下链接采取代码。

如何自定义分组表格视图单元格的背景/边框颜色?

 // // 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]; 

这样做给了我透明的细胞。 我尝试了与代码打架,但可以得到任何结果。 请帮我一下 我真的不知道这个代码将如何运行。

如果你的目标是iPhone OS 3.0+,你只需要这样做:

 cell.backgroundColor = [UIColor redColor]; 

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

嗨,大家好,

我有这个代码工作….

只是做了这个…..

在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]; } 

和你的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; } 

记住不要在(cell == nil)块中做到这一点,并特别感谢所有人

如何自定义分组表格视图单元格的背景/边框颜色?

我不得不同意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值。

不可能更容易。