在我的应用程序中,我使用了“UITableView
我的问题”。我的问题是我想删除中最后一个单元格的最后一个边框UITableView
。
请检查以下图片:
Answers:
15年9月14日更新。我原来的答案已过时,但它仍然是所有iOS版本的通用解决方案:
您可以隐藏tableView
的标准分隔符行,并将自定义行添加到每个单元格的顶部。添加自定义分隔符的最简单方法是添加UIView
1px的高度:
UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, cell.bounds.size.width, 1)];
separatorLineView.backgroundColor = [UIColor grayColor];
[cell.contentView addSubview:separatorLineView];
到目前为止,我订阅了另一种隐藏额外的分隔符的方式(在iOS 6.1+上有效):
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
最好的解决方案是添加页脚视图。以下代码完美地隐藏了最后一个单元格的行:
目标C
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 1)];
迅捷4.0
tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 1))
if(indexPath.row == [self.tableView numberOfRowsInSection:indexPath.section] - 1) { self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 1)]; }
在CellForRowAtIndexPath
数据源中
1.0f
作为代理中的页脚高度传递给我-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
。现在,它就像一种魅力。上传
在iOS 7中,有一个更简单的解决方案。假设单元格是您的最后一个单元格:
cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);
这适用于iOS 7和8:
cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, CGRectGetWidth(tableView.bounds));
注意:请谨慎使用tableView.bounds
,因为有时它会根据您调用的时间报告错误的值。请参见在横向模式下报告错误边界
cell!.separatorInset = UIEdgeInsetsMake(0, 0, 0, CGRectGetWidth(self.tableView.bounds)-self.view.layoutMargins.left)
在中添加此行代码viewDidLoad()
。
tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 0.001))
这确保最后一个分隔符将被替换,并且替换(不可见)的页脚视图将不占据任何额外的高度。由于页脚视图的宽度将由管理UITableView
,因此您可以将其设置为0。
.zero
表格底部保留一个分隔符。
CGRect
您添加的扩展名不是一个好习惯。如果您不喜欢0
示例代码中的繁琐代码,则可以这样编写:var frame = CGRect.zero \n frame.size.height = 0.001
.zero
,但可以使用实际的零(0.001)来满足您的需要。
CGRect.myZero
不能很好地说明其功能。
almostZero
如果这使它不灵活,则可以调用它。您可以在上面添加一些注释static let ...
以对其进行描述(使用3 /,这样您就可以通过xCode的自动完成界面看到它)。
Swift 4基于扩展的解决方案,在iOS 12上进行了测试
我注意到,设置的空视图height = 1
也会删除最后一个可见单元格height = 0
的分隔符,但是设置只会删除空单元格的分隔符
extension UITableView {
func removeSeparatorsOfEmptyCells() {
tableFooterView = UIView(frame: .zero)
}
func removeSeparatorsOfEmptyCellsAndLastCell() {
tableFooterView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 0, height: 1)))
}
}
我的短版:
self.tblView.tableFooterView = [UIView new];
在Swift中简单地:
tableView.tableFooterView = UIView()
UITableViewController
这是我目前使用的补救措施。它可能不是最好的方法,但它可以工作。
删除SeparatorColor和setSeparatorStyle以创建自定义分隔符
- (void)viewDidLoad
{
[super viewDidLoad];
...
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
[self.tableView setSeparatorColor:[UIColor clearColor]];
}
将自定义分隔符添加到具有tableview背景的每个单元格
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
...
UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.frame.size.height-1, 320, 1)];
separatorLineView.backgroundColor = self.tableView.backgroundColor;
[cell.contentView addSubview:separatorLineView];
return cell;
}
对于iOS 7及更高版本
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
BOOL bIsLastRow = NO;
//Add logic to check last row for your data source
NSDictionary *dict = [_arrDataSource objectAtIndex:indexPath.section];
if([_arrDataSource lastObject] == dict)
{
bIsLastRow = YES;
}
//Set last row separate inset left value large, so it will go outside of view
if ([cell respondsToSelector:@selector(setSeparatorInset:)])
{
[cell setSeparatorInset:UIEdgeInsetsMake(0, bIsLastRow ? 1000 :0, 0, 0)];
}
}
在cellForRow
委托中找到最后一个单元格索引,然后从下面放入代码行:
cell.separatorInset = UIEdgeInsetsMake(
0.f,
40.0f,
0.f,
self.view.frame.size.width-40.0f
);
另一种选择是通过子类化UITableView
:
@synthesize hideLastSeparator = _hideLastSeparator;
@synthesize hideLastSeparatorView = _hideLastSeparatorView;
-(void)setHideLastSeparator:(BOOL)hideLastSeparator {
if (_hideLastSeparator == hideLastSeparator) {
return;
}
_hideLastSeparator = hideLastSeparator;
if (_hideLastSeparator) {
_hideLastSeparatorView = [[UIView alloc] initWithFrame:CGRectMake(0, self.contentSize.height, self.bounds.size.width, 0.5f)];
_hideLastSeparatorView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
_hideLastSeparatorView.backgroundColor = self.backgroundColor;
[self addSubview:_hideLastSeparatorView];
[self hideSeparator];
}
else {
[_hideLastSeparatorView removeFromSuperview];
_hideLastSeparatorView = nil;
}
}
-(void)setContentSize:(CGSize)contentSize {
[super setContentSize:contentSize];
if (_hideLastSeparator) {
[self hideSeparator];
}
}
-(void)hideSeparator {
CGRect frame = _hideLastSeparatorView.frame;
frame.origin.y = self.contentSize.height - frame.size.height;
_hideLastSeparatorView.frame = frame;
}
该.H应该只包含属性声明为hideLastSeparator
和hideLastSeparatorView
。
要隐藏分隔符时,请使用新类并设置myTableView.hideLastSeparator = YES
。
它的工作方式是通过在最后一个分隔符上添加新视图来阻塞它。
在我看来,这比使用自定义分隔符或设置最后一个单元格的last splitInset更加容易使用,并且避免了某些tableFooterView
有时会因设置方法而引起的怪异动画(例如,在行插入/删除或其他表期间)动画)。
如果您将自定义分隔符用于您UITableViewCell
的最佳解决方案是:
separatorView
class YourCell: UITableViewCell {
// Your implementation goes here...
// Separator view in cell
@IBOutlet private weak var separatorView: UIView!
// This function hides the separator view
func hideSeparator() {
separatorView.isHidden = true
}
}
tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
计算单元格是否为最后一个并隐藏其分隔符时public func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
guard let cell = cell as? YourCell else {
return
}
// Here we're checking if your cell is the last one
if indexPath.row == tableView.numberOfRows(inSection: indexPath.section) - 1 {
// if true -> then hide it
cell.hideSeparator()
}
}
扩展Tonny Xu的答案,我有多个部分,这似乎可以删除最后一个单元格分隔符
if(indexPath.row == [self.tableView numberOfRowsInSection:indexPath.section] - 1)
{
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 1)];
}
在cellForRowAtIndexPath
数据源中
tableFooterView
存在于整个表格,而不仅仅是最后一个单元格。总体而言,骇人听闻的解决方案可能并不总是有效。