为tableview(uitableview)绘制自定义单元格,更改颜色和分隔符颜色和宽度 [英] Draw a Custom cell for tableview ( uitableview ) , with changed colors and separator color and width

查看:128
本文介绍了为tableview(uitableview)绘制自定义单元格,更改颜色和分隔符颜色和宽度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to draw the background of a UITableViewCell which has a grouped style. The problem with me is I am not able to call the -(void)drawRect:(CGRect)rect or I think it should be called programmatically...

我已从以下链接中获取代码。

I have taken code from following link .

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

//
//  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没有被自动调用.........

but the problem is my drawRect is not getting called automatically.........

我是这样做的。

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

这样做会给我透明的细胞。
我尝试使用代码进行争夺,但可以获得任何结果。请帮帮我。我真的不知道这个代码将如何运行。

and doing this gives me transparent cell. I tried and fought with code but could get any results. Please help me out. I am really having no idea how this code will run.

推荐答案

HI GUYS,

我已经有了这个代码....

I have got this code working....

就这样做了.......

just did this.....

在CustomCellBackGroundView

In 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类中就这样做.....

and in ur UITableViewController class just do this.....

- (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)块中执行此操作并特别感谢给所有人

remeber dont do this in (cell==nil) block and give special thanks to all folks at

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

这篇关于为tableview(uitableview)绘制自定义单元格,更改颜色和分隔符颜色和宽度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆