У своєму додатку я використовую UITableView
Моя проблема полягає в тому, що я хочу видалити останню межу останньої комірки в UITableView.
Будь ласка, перевірте наступне зображення:
Відповіді:
Оновлено 14.09.15. Моя оригінальна відповідь застаріла, але вона все ще є універсальним рішенням для всіх версій 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]];
}
Додайте власний роздільник до кожної комірки з фоном табличного перегляду
- (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)];
}
}
Свіфт 4.2
Щоб отримати роздільник, який рухається зліва направо у вашій останній комірці, додайте це у свою UITableViewDataSource's tableView(_:cellForRowAt:)реалізацію:
if tableView.numberOfRows(inSection: indexPath.section) - 1 == indexPath.row {
cell.separatorInset = .zero
}
Якщо вам не потрібен роздільник для однієї конкретної комірки, спробуйте намалювати власний роздільник і встановити tableView.separatorStyle = .none.
_tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
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
}
}
Знайдіть останній індекс клітинки в 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.
Це працює шляхом перешкоджання останньому роздільнику шляхом додавання нового вигляду над ним.
На мій погляд, це дещо простіше у використанні (ніж використання користувальницького роздільника або встановлення останнього роздільника tableFooterViewВставлення останньої комірки) і дозволяє уникнути деяких дивних анімацій, які іноді викликає метод встановлення a (наприклад, під час вставки / видалення рядка або іншої таблиці анімація).
Якщо ви використовуєте спеціальні роздільники, UITableViewCellнайкращим рішенням є:
separatorViewclass 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()
}
}
Розширюючи відповідь Тонні Сю, у мене є кілька розділів, і це, здається, працює для видалення останнього роздільника комірок
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існує для всієї таблиці, а не лише для останньої комірки. Загалом, хакерське рішення і може не завжди спрацювати.