В моем приложении я использую UITableView
Моя проблема в том, что я хочу удалить последнюю границу последней ячейки в UITableView
.
Пожалуйста, проверьте следующее изображение:
В моем приложении я использую UITableView
Моя проблема в том, что я хочу удалить последнюю границу последней ячейки в UITableView
.
Пожалуйста, проверьте следующее изображение:
Обновлено 9/14/15. Мой оригинальный ответ устарел, но он по-прежнему является универсальным решением для всех версий iOS:
Вы можете скрыть стандартную разделительную линию tableView
и добавить свою пользовательскую строку вверху каждой ячейки. Самый простой способ добавить пользовательский разделитель - добавить простой UIView
из 1px height:
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];
Лучшим решением является добавление нижнего колонтитула. Следующий код отлично скрывает последнюю строку ячейки:
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 существует более простое решение. Предполагаемая ячейка - это ваша последняя ячейка:
cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);
Это работает для меня в iOS 7 и 8:
cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, CGRectGetWidth(tableView.bounds));
ПРИМЕЧАНИЕ. Будьте осторожны при использовании tableView.bounds
, поскольку он иногда сообщает о неправильном значении в зависимости от того, когда вы его вызываете. См. Сообщить о неправильных границах в ландшафтном режиме
Нет, вы не можете этого сделать. Эти сепараторы довольно вырезаны и сухие, стиль и цвет, что и он. Однако альтернативным решением могло бы быть полное удаление разделителей и установка фонового изображения с горизонтальной линией внизу для всех ячеек, кроме последней.
E.X:
[tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
if (indexPath.row == [myArray count] - 1) {
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
[cell setBackgroundView:imageView];
}
Вот средство, которое я сейчас использую. это может быть не лучший подход, но он работает.
Удалить SeparatorColor и setSeparatorStyle для создания пользовательского разделителя
- (void)viewDidLoad
{
[super viewDidLoad];
...
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
[self.tableView setSeparatorColor:[UIColor clearColor]];
}
Добавить пользовательский разделитель в каждую ячейку с backgroundview background
- (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];
Добавьте эту строку кода в viewDidLoad()
.
tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 0.001))
Это гарантирует, что последний разделитель будет заменен, а замена (невидимая) нижнего колонтитула не займет никакой дополнительной высоты. Поскольку ширина представления нижнего колонтитула будет управляться с помощью UITableView
, поэтому вы можете установить его на 0.
Для 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)];
}
}
В Swift просто:
tableView.tableFooterView = UIView()
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
);
Другим вариантом является подклассификация 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
.
Способ, которым это работает, заключается в том, что препятствует последнему разделителю, добавляя к нему новый вид.
Это несколько проще использовать по моему мнению (чем использовать пользовательский разделитель или установить последний разделительInset последней ячейки) и позволяет избежать некоторых странных анимаций, которые иногда вызывает метод установки tableFooterView
(например, во время строки вставка/удаление или другие анимации таблиц).
Swift 4.2
Чтобы получить разделитель, который идет слева направо в вашей последней ячейке, добавьте его в tableView(_:cellForRowAt:)
вашего UITableViewDataSource's
tableView(_:cellForRowAt:)
:
if tableView.numberOfRows(inSection: indexPath.section) - 1 == indexPath.row {
cell.separatorInset = .zero
}
Если вы не хотите использовать разделитель для одной конкретной ячейки, рассмотрите возможность создания собственного разделителя и установите tableView.separatorStyle =.none
.
Решение на основе расширений для 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)))
}
}
Развернувшись на 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
datasource