我有一个UITableView从XIB文件加载自定义UITableViewCell。一切都工作正常,但我的布局要求单元格(都在一个单独的部分内)之间有间距。 有没有机会这样做而不必提高行高?
现在怎么样
它是如何被认为是
修改
这就是今天的代码
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [[self.cards valueForKeyPath:@"cards"] count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
[ccTableView setBackgroundColor:[UIColor clearColor]];
cardsCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cardsCell"];
if(cell == nil){
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"cardsCell" owner:self options:nil];
cell = [topLevelObjects objectAtIndex:0];
}
NSString *nmCard = [[self.cards valueForKeyPath:@"cards.name"] objectAtIndex:indexPath.row];
cell.descCardLabel.text = nmCard;
return cell;
}
答案 0 :(得分:37)
如果您使用自定义的uitableviewcell类,我发现它实际上是一个非常简单的解决方案。
在单元格类中,添加以下代码:
- (void)setFrame:(CGRect)frame {
frame.origin.y += 4;
frame.size.height -= 2 * 4;
[super setFrame:frame];
}
这将为你在你调用这个单元格的uitablview类中的单元格高度提供一个4pt缓冲区。显然,你现在必须在放入标签和图像时补偿单元格中较少的空间,但它作品。您也可以在x轴上执行相同的操作,以使单元格的宽度更小。我已在我的应用中完成此操作,以显示我的单元格后面的背景图像。
答案 1 :(得分:7)
如果无法更改单元格的高度,解决方案是使用不可见的中间体 所需高度的细胞。在这种情况下,您需要在表视图委托和数据源中重新计算索引。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CELL_ID2 = @"SOME_STUPID_ID2";
// even rows will be invisible
if (indexPath.row % 2 == 1)
{
UITableViewCell * cell2 = [tableView dequeueReusableCellWithIdentifier:CELL_ID2];
if (cell2 == nil)
{
cell2 = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CELL_ID2];
[cell2.contentView setAlpha:0];
[cell2 setUserInteractionEnabled:NO]; // prevent selection and other stuff
}
return cell2;
}
[ccTableView setBackgroundColor:[UIColor clearColor]];
cardsCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cardsCell"];
if(cell == nil){
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"cardsCell" owner:self options:nil];
cell = [topLevelObjects objectAtIndex:0];
}
// Use indexPath.row/2 instead of indexPath.row for the visible section to get the correct datasource index (number of rows is increased to add the invisible rows)
NSString *nmCard = [[self.cards valueForKeyPath:@"cards.name"] objectAtIndex:(indexPath.row/2)];
cell.descCardLabel.text = nmCard;
return cell;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
// two times minus one (invisible at even rows => visibleCount == invisibleCount+1)
return [[self.cards valueForKeyPath:@"cards"] count] * 2 - 1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row % 2 == 1)
return 40;
return 162;
}
您还需要重新计算:didSelectRowAtIndexPath:
的indexPath.row以及使用它的其他方法。
答案 2 :(得分:4)
虽然@ A-Live在技术上是正确的,但是为了防止其他问题,例如:你忘记在某处放置一个indexPath.row / 2,你可以执行以下操作(不涉及编程):
比如说你的UITableViewCell高度通常是90分,你希望每个单元格之间有10个点的间距。使你的UITableViewCell高100点,让UITableViewCell的底部10点空白(没有任何类型的对象)。然后单击界面构建器中的UITableViewCell并将backgroundColor设置为您想要的间距区域颜色。
瞧!你可以在每个单元格之间留一些间距,比编程/ 2更容易!
答案 3 :(得分:0)
如果您正在寻找快速解决方案,reddit的答案对我来说非常有效。
class CustomTableViewCell: UITableViewCell {
override var frame: CGRect {
get {
return super.frame
}
set (newFrame) {
var frame = newFrame
frame.origin.y += 4
frame.size.height -= 2 * 4
super.frame = frame
}
}
}