如何删除UITableView中最后一个单元格的最后一个边框?
在我的应用程序,我使用UITableView
我的问题是,我想删除UITableView
中的最后一个单元格的最后一个边框。
请检查以下图片:
更新于9/14/15。 我原来的答案已经过时了,但它仍然是所有iOS版本的通用解决scheme:
您可以隐藏tableView
的标准分隔线,并在每个单元格的顶部添加自定义行。 添加自定义分隔符最简单的方法是添加1px高度的简单UIView
:
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];
最好的解决scheme是添加页脚视图。 以下代码完美地隐藏了最后一个单元格的行:
Objective-C的
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 1)];
Swift 4.0
tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 1))
在iOS 7中有一个更简单的解决scheme。 假设细胞是你最后的细胞:
cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);
这适用于我在iOS 7和8:
cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, CGRectGetWidth(tableView.bounds));
注意:要小心使用tableView.bounds
因为它有时会根据您何时调用它报告错误的值。 请参阅在横向模式下报告不正确的边界
不,你不能这样做。 这些分离器是非常切割和干燥,风格和颜色就是这样。 但是,另一种解决scheme可能是将所有单元全部closures,并在底部为除最后一个单元之外的所有单元设置水平线。
EX:
[tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; if (indexPath.row == [myArray count] - 1) { UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]]; [cell setBackgroundView:imageView]; }
这是我目前使用的补救措施。 它可能不是最好的方法,但它的工作原理。
删除SeparatorColor和setSeparatorStyle来创build自定义分隔符
- (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; }
我的简短版本:
self.tblView.tableFooterView = [UIView new];
对于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)]; } }
下面的代码可以帮助我从UITableView的最后一行删除分隔符。
Swift 3.0
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if indexPath.row == tableView.numberOfRows(inSection: indexPath.section) { cell.separatorInset.right = cell.bounds.size.width } }
_tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
查找cellForRow
委托中的最后一个单元索引,并从下面放置代码行:
cell.separatorInset = UIEdgeInsetsMake( 0.f, 40.0f, 0.f, self.view.frame.size.width-40.0f );
另一种select是通过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
。
这个工作的方式是通过添加一个新的视图来阻止最后一个分隔符。
在我看来,这比使用自定义分隔符(或者设置最后一个单元格的最后一个separatorInset)要容易一些,并且避免了设置tableFooterView
有时会导致的一些奇怪的animation(例如在行插入/删除或其他表animation)。
在Swift中简单地说:
tableView.tableFooterView = UIView()
在viewDidLoad()
添加这一行代码。
tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 0.001))
这确保最后一个分隔符将被replace和replace(不可见)页脚视图不会占用任何额外的高度。 由于页脚视图的宽度将由UITableView
pipe理,因此您可以将其设置为0。
在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
数据源中