我一直在寻找无处可寻的答案。
我用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;
}
答案 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
的最终外观将如下所示:
考虑到这对性能不是很好,特别是如果你有很多细胞。如果您有更多数据,请参阅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。如... ....
使用重复使用ID
传递确定该行是否应显示的属性:
[cell setCustomLines:Model.property];
返回单元格;
<小时/> 您可以更灵活地以任何方式设计CustomCell,图像,线条,颜色或其他方式让您的用户看到您的单元格之间的差异。
从技术上讲,Marco的答案将起作用,并且在一个简单的解决方案上做得很好。但是你不可能将此扩展得更远。
答案 4 :(得分:0)
这不是问题的答案,而是原始问题的清洁解决方案。
添加一个空的UIView作为UITableView的页脚。然后隐藏空单元格。见this answer。