如何像 Twitter 一样自定义 UITableViewCell?

Posted

技术标签:

【中文标题】如何像 Twitter 一样自定义 UITableViewCell?【英文标题】:How can I custom UITableViewCell like Twitter? 【发布时间】:2012-02-11 04:25:35 【问题描述】:

我发现iPad twitter.app UITableViewCell 的边框有两条像素线,看起来又漂亮又专业,我该怎么做?谢谢!

【问题讨论】:

你应该回去接受一些关于你之前问题的答案。这会让人们更愿意回答。 【参考方案1】:

因为UITableViewCell 继承自UIView,所以单元格具有内容视图。您可以将自己的子视图(标签和文本字段)添加到 contentView,并以编程方式或使用 Interface Builder 对其进行布局。

有很多关于如何做到这一点的在线教程。只需用 google 搜索“uitableviewcell 界面构建器教程”即可。

看看这个很好的教程Custom UITableViewCell Using Interface Builder

【讨论】:

好的,我现在试试。谢谢 Srikar!【参考方案2】:

最后,我自定义了 UITableViewCell 的使用代码,我觉得它看起来不错。 :)

MenuViewController.m 文件:

- (id)initWithFrame:(CGRect)frame 
    if (self = [super init]) 
        [self.view setFrame:frame]; 

        _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:UITableViewStylePlain];
        [_tableView setDelegate:self];
        [_tableView setDataSource:self];
        [_tableView setBackgroundColor:[UIColor clearColor]];
        [_tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];

        UIView* footerView =  [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 1)];
        [_tableView setTableFooterView:footerView];
        [footerView release];        

        [self.view addSubview:_tableView];
    
    return self;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    static NSString *CellIdentifier = @"Cell";

    DoubleSeparatorCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
        cell = [[[DoubleSeparatorCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    

    NSString *text;
    UIColor *upperLineColor,*lowerLineColor,*viewColor;

    upperLineColor = RGBA(255, 255, 255, 30);
    lowerLineColor = RGBA(0, 0, 0, 50);
    viewColor = RGBA(0,0,0,5);

    if ([indexPath row] == 0) 
        text = NSLocalizedString(@"...", nil);
     else if ([indexPath row] == 1) 
        text = NSLocalizedString(@"...", nil);
     else if ([indexPath row] == 2) 
        text = NSLocalizedString(@"...", nil);
     else 
        text = NSLocalizedString(@"...", nil);
    
    [cell.textLabel setText:text];
    [cell.textLabel setTextColor:RGBA(170, 170, 170, 100)];
    [cell.textLabel setShadowColor:[UIColor blackColor]];
    [cell.textLabel setShadowOffset:CGSizeMake(1, 1)];

    [cell.upperLine setBackgroundColor:upperLineColor];
    [cell.lowerLine setBackgroundColor:lowerLineColor];
    [cell.contentView setBackgroundColor:viewColor];

    return cell;

DoubleSeparatorCell.h

@interface DoubleSeparatorCell : UITableViewCell 
    UIView *upperLine;
    UIView *lowerLine;

@property (nonatomic ,retain) UIView *upperLine;
@property (nonatomic ,retain) UIView *lowerLine;
@end

DoubleSeparatorCell.m

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) 
        self.upperLine = [[UIView alloc] init];
        self.lowerLine = [[UIView alloc] init];
        [self.contentView addSubview:self.upperLine];
        [self.contentView addSubview:self.lowerLine];
    
    return self;


- (void)layoutSubviews 
    [super layoutSubviews];
    [self.upperLine setFrame:CGRectMake(0, 0, self.contentView.frame.size.width, 1)];
    [self.lowerLine setFrame:CGRectMake(0, self.contentView.frame.size.height - 1, self.frame.size.width, 1)];

【讨论】:

【参考方案3】:

Srikar 已经向您展示了正确的道路。顺便说一句,我只想添加以下内容:

您可以通过继承本机类 UITableViewCell 以编程方式自定义单元格。 然后,创建表格视图单元类的实例并将其添加到 UITableView。 现在牢房是你的了。

快乐编码, 阿伦

【讨论】:

【参考方案4】:

我要指出的是,您截屏的那些单元格似乎具有 1 点的浅灰色顶部边框和 1 点的深灰色底部边框(或者它们可能是像素 - 抱歉,我的眼睛不太好:- ) )。

所以这可能是一种 hack(继续,野蛮我的人),但你可以:

    创建带有框架 CGRect(0,0,cell.contentView.frame.size,width,1) 的 UILabel topBorder 创建带有框架 CGRect (0,cell.contentView.frame.size.height - 1,cell.contentView.frame.size.width,1) 的 UILabel bottomBorder 将 topBorder 的颜色设置为 UIColor lightGrayColor(或调整为确切的颜色) 将 bottomBorder 的颜色设置为 UIColor darkGrayColor(同上) 将两个子视图添加到 cell.contentView

请注意,您不必继承 UITableCellView - 只需将这些步骤添加到您的 tableView:cellForRowAtIndexPath: 方法中,它们就会出现。

享受,

达米安

【讨论】:

【参考方案5】:

重写 drawRect 方法并根据需要绘制线条。

- (void)drawRect:(CGRect)rect

      CGRect bounds = [self bounds];
      CGContextRef context      = UIGraphicsGetCurrentContext();    
      CGContextSetLineWidth(context, 1.0);
      CGContextSetStrokeColorWithColor(context, [topColor CGColor]);
      // border top
      CGContextMoveToPoint(context, bounds.origin.x, bounds.origin.y);
      CGContextAddLineToPoint(context, bounds.origin.x+bounds.size.width, bounds.origin.y);
      CGContextStrokePath(context); 
      // border bottom
      CGContextSetLineWidth(context, 1.0);
      CGContextSetStrokeColorWithColor(context, [lowerColor CGColor]);

      CGContextMoveToPoint(context, bounds.origin.x, bounds.origin.y+1);
      CGContextAddLineToPoint(context, bounds.origin.x+bounds.size.width, bounds.origin.y+1);

      CGContextStrokePath(context); 

【讨论】:

以上是关于如何像 Twitter 一样自定义 UITableViewCell?的主要内容,如果未能解决你的问题,请参考以下文章

如何在已经是 NIB 的 UICollectionViewCell 中加载带有自定义单元格的 UITable

如何像在 mashable.com 中一样计算来自 Facebook、Twitter、G+ 等的总份额

自定义 UIView 中的 UItable

如何像 uitableviewcell 一样重用/回收自定义元素?

如何像 Apple Pro Apps 一样自定义 NSMenu?

如何像 Flutter 中的专业人士一样创建自定义大小的 TabBar?