Ответ 1
Это работало безупречно для меня, чтобы добавить разделитель в последнюю ячейку. получайте удовольствие!
self.tableView.tableFooterView = [[UIView alloc] init];
Вопрос в том, что самый лучший способ отображения разделителя в последней ячейке таблицы/раздела.
В основном это то, чем я занимаюсь.
Это из приложения для родной музыки, что заставляет меня думать, что его можно достичь только с помощью
UITableView
, они не будут использовать какой-либо частный API для разделителей ячеек, правильно?
Я знаю, что вы можете уйти, не используя фактические разделители, но добавляя одну пиксельную линию в нижней части ячейки. Но я не поклонник этого подхода, потому что
Также есть что-то в ссылке UITableView, которая заставляет меня думать, что есть простой способ получить то, что я хочу:
В iOS 7 и более поздних версиях разделители ячеек не распространяются полностью на край представления таблицы. Это свойство устанавливает стандартную вставку для всех ячейки в таблице, так же как rowHeight задает высоту по умолчанию для клетки. Он также используется для управления "дополнительными" разделителями, нарисованными на нижняя часть таблиц с обычным стилем.
Кто-нибудь знает, как именно использовать эти "дополнительные" разделители, рисуемые внизу таблиц обычного стиля? Потому что это именно то, что мне нужно.
Я думал, что присваивание separatorInset
UITableView
, а не UITableViewCell
выполнит трюк, но это не так, последняя ячейка все еще не имеет разделителя.
В данный момент я вижу только один вариант: иметь пользовательский раздел нижнего колонтитула для имитации разделителя для последней ячейки. И это плохо, особенно если вы хотите иметь фактический нижний колонтитул раздела, используя метод tableView:titleForFooterInSection:
.
Это работало безупречно для меня, чтобы добавить разделитель в последнюю ячейку. получайте удовольствие!
self.tableView.tableFooterView = [[UIView alloc] init];
Я только что нашел что-то, что работает для меня. В нескольких словах: дать вашему UITableView табличное представление и установить его высоту кадра 0. Это делает фактическое отображение разделителя с правильными вставками.
Более подробно: если вы используете раскадровку, перетащите UIView в нижнюю часть вашего представления таблицы (в древовидном представлении слева), чтобы он отображался чуть ниже Table View Cell на том же иерархическом уровне. Это создает tableFooterView. Конечно, это можно сделать и программным способом.
Затем в вашей реализации UITableViewController:
UIView *footerView = self.tableView.tableFooterView;
CGRect footerFrame = footerView.frame;
footerFrame.size.height = 0;
[footerView setFrame:footerFrame];
Сообщите мне, если это сработает для вас! Он также может работать для первого разделителя, если вместо этого вы используете tableHeaderView, но я не пробовал его.
это будет делать именно то, что вы хотите... хотя линия будет занимать всю ширину ячейки:
in - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
self.tableView.separatorColor = [UIColor redColor];
self.tableView.separatorInset = UIEdgeInsetsZero;
У меня была аналогичная проблема, и я нашел обходной путь. Apple скрывает последний разделитель uitableviewcell, а затем отображает его, если вы выберете ячейку или вызовите select и отмените выбор в этой ячейке.
Итак, я учил, что лучше всего в - (void)layoutSubviews
. Вид разделителя называется _separatorView
, и это частное свойство. Используя выделенные или выделенные ячейки, вы можете найти что-то вроде этого:
- (void)layoutSubviews
{
// Call super so the OS can do it layout first
[super layoutSubviews];
// Get the separator view
UIView *separatorView = [self valueForKey:@"_separatorView"];
// Make the custom inset
CGRect newFrame = CGRectMake(0.0, 0.0, self.bounds.size.width, separatorView.frame.size.height);
newFrame = CGRectInset(newFrame, 15.0, 0.0);
[separatorView setFrame:newFrame];
// Show or hide the bar based on cell state
if (!self.selected) {
separatorView.hidden = NO;
}
if (self.isHighlighted) {
separatorView.hidden = YES;
}
}
Что-то вроде этого.
Вы можете сделать что-то вроде этого, если вы не используете разделы:
- (void)viewDidLoad
{
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(insetLeftSide, 0, width - insetRightSide, 1)];
}
Если вы используете разделы, реализуете нижний колонтитул в каждом разделе как один вид точки в методах
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
}
Это позволит вам иметь разделитель для вашей последней ячейки, который на самом деле не является разделителем, представляет собой нижний колонтитул, который вы можете играть с ним и сделать его похожим на разделитель
В iOS 8, если у вас есть UITableView в обычном стиле и добавлен нижний колонтитул, последний разделитель исчез. Однако вы можете легко воссоздать его, добавив пользовательский вид разделителя в нижний колонтитул.
Этот пример точно имитирует стиль сепаратора Today
override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
//create footer view
let result = UIView()
result.frame.size.height = tableView.rowHeight
//recreate last cell separator, which gets hidden by footer
let sepFrame = CGRectMake(15, -0.5, tableView.frame.width, 0.5);
let vibrancyEffectView = UIVisualEffectView.init(effect: UIVibrancyEffect.notificationCenterVibrancyEffect())
vibrancyEffectView.frame = sepFrame
vibrancyEffectView.contentView.backgroundColor = tableView.separatorColor
result.addSubview(vibrancyEffectView)
return result
}
Если вы добавите пустой нижний колонтитул, тогда tableview удалит все оставшиеся разделители строк (для несуществующих ячеек), но по-прежнему будет включать разделитель для последней ячейки:
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
return [UIView new];
}
Работает в iOS 7.x и 8.x(помещает его в cellForRowAtIndexPath):
(PS замените "максимальные элементы вашего источника данных" на счетчик данных вашего массива)
if (row == <max elements of your datasource>-1) {
UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.contentView.frame.size.height-1, self.view.frame.size.width, 1)];/// change size as you need.
separatorLineView.tag = 666;
separatorLineView.backgroundColor = [UIColor colorWithRed: 204.0/255.0 green: 204.0/255.0 blue: 204.0/255.0 alpha:1.0];
UIView *separator = [cell.contentView viewWithTag:666];
// case of orientation changed..
if (separator.frame.size.width != cell.contentView.frame.size.width) {
[[cell.contentView viewWithTag:666] removeFromSuperview];
separator = nil;
}
if (separator==nil) [cell.contentView addSubview:separatorLineView];
}
Это определенно помогает. За работой. но установите разделитель "none" из инспектора атрибутов. Напишите следующий код в методе cellForRowAtIndexPath
if(indexPath.row==arrData.count-1){
UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0,
cell.contentView.frame.size.height - 1.0,
cell.contentView.frame.size.width, 1)];
lineView.backgroundColor = [UIColor blackColor];
[cell.contentView addSubview:lineView];
}
Следующий код работал у меня:
UIView *footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 0.35)];
footerView.backgroundColor = [UIColor whiteColor];
CGRect frame = footerView.frame;
frame.origin.x = 15;
frame.size.width = frame.size.width - 15;
UIView *blackView = [[UIView alloc] initWithFrame:frame];
[blackView setBackgroundColor:[UIColor blackColor]];
blackView.alpha = 0.25;
[footerView addSubview:blackView];
tableView.tableFooterView = footerView;
Надеюсь, что это сработает и для вас.