Как настроить разделитель таблицы в iPhone

По умолчанию в uitableview есть разделитель одной строки.

Но я хочу поставить свою настраиваемую строку как разделитель.

Является ли это возможным? Как?

Если вы хотите сделать больше, чем изменить цвет разделителя, используя свойство separatorColor UITableView, вы можете установить для свойства separatorStyle значение UITableViewCellSeparatorStyleNone, а затем либо:

  • создавать пользовательские UITableViewCell, которые include в себя ваш пользовательский разделитель внутри них
  • создавать альтернативные UITableViewCell s, которые include ваш пользовательский разделитель

Например, если ваша таблица в настоящее время отображает 5 строк, вы можете обновить ее, чтобы отобразить 9 строк, а строки с индексом 1, 3, 5, 7 будут ячейками разделителя.

См. Подclass UITableViewCell в Руководстве по программированию таблиц для получения дополнительной информации о том, как создавать пользовательские UITableViewCell .

Лучшим решением является использование текущей ширины и высоты ячейки. Что-то вроде этого:

UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.contentView.frame.size.height - 1.0, cell.contentView.frame.size.width, 1)]; lineView.backgroundColor = [UIColor darkGrayColor]; [cell.contentView addSubview:lineView]; 

Если вам нужны разные цвета seperator для разных строк или вы хотите, чтобы сепаратор оставался видимым, когда строка подсвечивается краном, попробуйте это:

 self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; // We have to use the borderColor/Width as opposed to just setting the // backgroundColor else the view becomes transparent and disappears during // the cell's selected/highlighted animation UIView *separatorView = [[UIView alloc] initWithFrame:CGRectMake(0, 43, 1024, 1)]; separatorView.layer.borderColor = [UIColor redColor].CGColor; separatorView.layer.borderWidth = 1.0; [cell.contentView addSubview:separatorView]; 

Это предполагает, что цвет вашей ячейки прозрачен.


Вышеупомянутое решение получило некоторые обширные эксперименты. Вот некоторые заметки о моих выводах, которые, я уверен, помогут людям:

В обычном «не выбранном» состоянии

  • ContentView (что в вашем XIB, если вы его не закодировали иначе) рисуется нормально
  • Выбранный BackboxView Скрыт
  • Фоновый вид виден (при условии, что ваш contentView прозрачен, вы видите backgroundView или (если вы не определили backgroundView, вы увидите цвет фона самого UITableView)

Выбирается ячейка, немедленно происходит с-OUT любая анимация:

  • Все представления / подзаголовки в contentView имеют свой backgroundColor, очищенный (или установленный на прозрачность), изменение цвета текста ярлыка и т. Д. До их выбранного цвета
  • Выбранный методBackgroundView становится видимым (это представление всегда является полным размером ячейки (пользовательский фрейм игнорируется, если вам нужно его использовать), также обратите внимание, что backgroundColor subViews по какой-либо причине не отображается, возможно, они настроены прозрачно как contentView). Если вы не определили selectedBackgroundView, тогда Cocoa создаст / вставляет синий (или серый) фон gradleиента и отображает это для вас)
  • Фоновый экран не изменяется

Когда ячейка отменяется, анимация для удаления подсветки начинается:

  • Свойство selectedABackgroundView alpha анимировано от 1.0 (полностью непрозрачное) до 0.0 (полностью прозрачное).
  • Фоновый экран снова не изменился (поэтому анимация выглядит как кроссфейд между выбраннымиBackgroundView и backgroundView)
  • Только после завершения анимации ContentView будет перерисовываться в «не выбранном» состоянии, а его subview backgroundColor снова станет видимым (это может привести к тому, что ваша анимация выглядит ужасной, поэтому желательно, чтобы вы не использовали UIView.backgroundColor в своем contentView)

Эти ответы приводят к тому, что подсветка rect будет перезаписана разделителем, который вы добавляете в свою ячейку (на iOS 6 с моим тестированием, по крайней мере). Вам нужно установить значение separatorColor в [UIColor clearColor] чтобы ячейки все еще были разделены на 1px, тогда вы можете нарисовать разделитель в промежутке:

 - (void)viewDidLoad { self.tableView.separatorColor = [UIColor clearColor]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // snip CALayer *separator = [CALayer layer]; separator.backgroundColor = [UIColor redColor].CGColor; separator.frame = CGRectMake(0, 43, self.view.frame.size.width, 1); [cell.layer addSublayer:separator]; return cell; } 

Вы добавляете следующий cellForRowAtIndexPath делегата tableView для создания пользовательского представления изображения высотой 1px и шириной 200px для каждогоCell

 UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 200, self.view.bounds.size.width, 1)]; lineView.backgroundColor = [UIColor blackColor]; [cell.contentView addSubview:lineView]; 

Примечание : я не знаю, насколько это тяжело для производительности.

Я не знаю, можно ли это сделать «автоматически» с некоторыми настройками. Но было бы предложение установить разделитель строк как ни одного, а в границах ваших ячеек на самом деле нарисовать ваш разделитель строк, который вы хотите.

Если вы используете пользовательские ячейки в Swift: альтернативный подход заключается в том, чтобы расширить UITableViewCell с помощью функции, которая может нарисовать линию вверху этой ячейки.

 import UIKit extension UITableViewCell { func addSeparatorLineToTop(){ let lineFrame = CGRectMake(0, 0, bounds.size.width, 1) let line = UIView(frame: lineFrame) line.backgroundColor = UIColor.myGray_300() addSubview(line) } } 

Затем вы можете добавить эту строку в любую пользовательскую ячейку, например, в awakeFromNib

 override func awakeFromNib() { super.awakeFromNib() addSeparatorLineToTop() } 

Это решение приятно, потому что оно не испортит ваш раскадровки и ограничивает ваш дополнительный код до 1 строки.

На экране сетчатки даже рисование линии с 0,5 единицами приведет к двухпиксельной линии из-за сглаживания. Чтобы отобразить его как один пиксель на обоих дисплеях, сдвиньте его на четверть единицы:

 UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, self.contentView.frame.size.height - (1.0 - 0.25), self.contentView.frame.size.wi lineView.backgroundColor = [UIColor colorWithRed:(230.0/255.0f) green:(233/255.0f) blue:(237.0/255.0f) alpha:1.0f]; [self.contentView addSubview:lineView]; 

Протестировано на iOS 7 (GM):

 @implementation MyTableViewController - (void)viewDidLayoutSubviews { for (UIView *view in self.view.subviews) { if ([view isKindOfClass:NSClassFromString(@"_UITableViewCellSeparatorView")]) view.backgroundColor = [UIColor redColor]; } } @end 

ПРИМЕЧАНИЕ. Кажется, UITableView перемещает разделители в ячейки в некоторых конфигурациях, что делает этот код неработающим, если вы не спуститесь во все UITableViewCells.

Ячейка в gist ниже является подclassом UITableViewCell, где каждая ячейка может иметь свой собственный разделитель w / many styles (в настоящее время поддерживаются только .None и .Default). Он написан в Swift и предполагает использование Autolayout.

https://gist.github.com/evgeniyd/fa36b6f586a5850bca3f

Как использовать class:

  1. установить стиль разделителя объекта UITableViewCellSeparatorStyle.None на UITableViewCellSeparatorStyle.None

     tableView.separatorStyle = .None 
  2. Создайте подclass MPSTableViewCell

  3. Где-то внутри awakeFromNib() задает стиль разделителя ячейки

Примечание: приведенный ниже код предполагает, что ячейка загружается из xib / раскадровки

  class FASWorkoutCell: FASTableViewCell { required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func awakeFromNib() { super.awakeFromNib() separatorType = .Default } // ... } 

Если вы используете настраиваемый UITableViewCell, вы можете просто добавить UIView в нижней части UItableViewCell.xib и поместить цвет фона в нужный цвет.

Например, на xib я добавляю UIView внизу и устанавливаю высоту как 1. Используя автозапуск, я устанавливаю левое ограничение на 12, нижнее ограничение на 0, правое ограничение на 0 и высоту до 1.

Быстрая версия:

 private let kSeparatorTag = 123 private let kSeparatorHeight: CGFloat = 1.5 func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { if cell.viewWithTag(kSeparatorTag) == nil //add separator only once { let separatorView = UIView(frame: CGRectMake(0, cell.frame.height - kSeparatorHeight, cell.frame.width, kSeparatorHeight)) separatorView.tag = kSeparatorId separatorView.backgroundColor = UIColor.redColor() separatorView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] cell.addSubview(separatorView) } } 
  • Использование не работает с UITableView seperatorColor?
  • Можете ли вы настраивать анимацию для встраиваемых ячеек UITableView?
  • Светло-серый фон в области «отскока» UITableView
  • 2 различных типа пользовательских UITableViewCells в UITableView
  • : непризнанный селектор, отправленный в экземпляр
  • Сохранять uitableview static при вставке строк вверху
  • Настройка стиля UITableViewCell при использовании iOS 6 UITableView dequeueReusableCellWithIdentifier: forIndexPath:
  • Как сделать дополнительный просмотр float в UICollectionView в виде заголовков секций в обычном стиле UITableView
  • Есть ли способ заставить ячейки UITableView в iOS 7 не иметь разрыв строки в разделителе?
  • Добавить салфетки для удаления UITableViewCell
  • Вид сетки в iPhone SDK
  • Давайте будем гением компьютера.