iPhone - 创建自定义UITableViewCell顶部和底部边框

时间:2012-12-20 21:42:43

标签: iphone uitableview cell

我一直在寻找无处可寻的答案。

我用JSON中的动态单元格填充UITableView,我试图隐藏任何额外的单元格。我在IB中关闭了分离器,当然所有的细胞分离器都消失了。如何在每个tableviewcell的底部和顶部添加一条线,以便只有具有信息的单元格显示边框?我已经导入了Quartz,并且一直在玩CALayer但是找不到解决方案。

我在这里找到了类似的问题,但唯一的答案并不是很有用。

这样做的更好,不同的方式是什么?

这是我的cellForRowAtIndexPath和我的numberOfRowsInSection:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    // Return the number of rows in the section.
    //set equal to the information in the array

    return [_jsonDataArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    //create Dictionary of data in row
    NSDictionary *jsoninfo = [_jsonDataArray objectAtIndex:indexPath.row];

    //get required keys from dictionary and assign to vairables
    NSString *title = [jsoninfo objectForKey:@"title"];
    NSString *subtitle = [jsoninfo objectForKey:@"subtitle"];
    NSURL *imageURL = [NSURL URLWithString:[jsoninfo objectForKey:@"series_image_URL"]];

    //download the images.
    NSData *imgData = [NSData dataWithContentsOfURL:imageURL];
    UIImage *img = [[UIImage alloc] initWithData:imgData];


    //set boarder for custom cells... I need to have a border on the top and bottom of the cells I am creating so xcode does not autofill the empty space.



    //fill in text to cells
    cell.textLabel.text = title;
    cell.detailTextLabel.text = subtitle;
    cell.imageView.image = img;

    return cell;
}

5 个答案:

答案 0 :(得分:24)

我也认为这不是最好的主意,但如果你真的想这样做,这里的代码将达到你想要的效果:

tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

// Draw top border only on first cell
if (indexPath.row == 0) {
    UIView *topLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 1)];
    topLineView.backgroundColor = [UIColor grayColor];
    [cell.contentView addSubview:topLineView];
}

UIView *bottomLineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.bounds.size.height, self.view.bounds.size.width, 1)];
bottomLineView.backgroundColor = [UIColor grayColor];
[cell.contentView addSubview:bottomLineView];

将此代码放在tableView:cellForRowAtIndexPath:方法中。您UITableView的最终外观将如下所示:

Table view with selective borders

考虑到这对性能不是很好,特别是如果你有很多细胞。如果您有更多数据,请参阅this SO question以获取有关如何优化绘图的帮助。

答案 1 :(得分:1)

仅在tableView:cellForRowAtIndexPath:方法

处尝试此操作
[cell.contentView.layer setBorderColor:[UIColor grayColor].CGColor];
[cell.contentView.layer setBorderWidth:1.0f];

答案 2 :(得分:0)

这听起来像是一个次优的解决方案,试图用线条“区分”你的有效单元格和空单元格。一种更好的方法是在用它填充表之前清理数据源。

答案 3 :(得分:0)

使用自定义单元格。您的Datasoure(模型)应将信息驱动到自定义单元格中。在Custom Cell类中创建一个可在每行设置的setter。如... ....


  1. 使用重复使用ID

  2. 分配您的自定义单元格
  3. 传递确定该行是否应显示的属性:
    [cell setCustomLines:Model.property];

  4. 返回单元格;

  5. <小时/> 您可以更灵活地以任何方式设计CustomCell,图像,线条,颜色或其他方式让您的用户看到您的单元格之间的差异。

    从技术上讲,Marco的答案将起作用,并且在一个简单的解决方案上做得很好。但是你不可能将此扩展得更远。

答案 4 :(得分:0)

这不是问题的答案,而是原始问题的清洁解决方案。

添加一个空的UIView作为UITableView的页脚。然后隐藏空单元格。见this answer