Как настроить разделитель tableView в iPhone
по умолчанию в uitableview есть один разделитель строк.
но я хочу поставить свою настроенную строку в качестве разделителя.
возможно ли это? Как?
12 ответов:
Если вы хотите сделать больше, чем изменить цвет разделителя с помощью separatorColor свойства UITableView затем вы можете установить separatorStyle свойство UITableViewCellSeparatorStyleNone и затем:
- создать кастом UITableViewCells, которые включают в себя ваш пользовательский разделитель внутри них
- создать альтернативный UITableViewCells, которые включают в себя ваш пользовательский разделитель
например, если ваша таблица в настоящее время отображает 5 строк, вы можете обновить ее до отображения 9 строк, а строки с индексом 1, 3, 5, 7 будут разделителями ячеек.
посмотреть Подкласс UITableViewCell на Руководство По Программированию В Виде Таблицы для получения дополнительной информации о том, как создавать пользовательские UITableViewCell s.
лучшим решением является использование текущей ширины и высоты ячейки. Что-то вроде этого:
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];
Если вам нужны разные цвета разделителя для разных строк или вы хотите, чтобы разделитель оставался видимым, когда строка выделена на кране, попробуйте следующее:
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, если вы не закодировали его иначе) рисуется нормально
- selectedBackgroundView скрыт
- backgroundView виден (поэтому, если ваш contentView прозрачен, вы видите backgroundView или (если вы не определили backgroundView, вы увидите цвет фона самого UITableView)
выделена ячейка, сразу же происходит следующее без какой-либо анимации:
- все виды/подвиды в contentView имеют свой backgroundColor очищен (или установлен в прозрачный), метка и т.д. Изменение цвета текста на их выбранный цвет
- selectedBackgroundView становится видимым (это представление всегда полный размер ячейки (пользовательский кадр игнорируется, используйте подвид, если вам нужно). Также обратите внимание, что фоновый цвет подвидов не отображается по какой-то причине, возможно, они установлены прозрачными, как на странице просмотр содержимого). Если вы не определили selectedBackgroundView, то Cocoa создаст / вставит синий (или серый) градиентный фон и отобразит его для вас)
- фоновый вид не изменился
когда ячейка снята, начинается анимация для удаления подсветки:
- свойство selectedBackgroundView alpha анимируется от 1.0 (полностью непрозрачный) до 0.0 (полностью прозрачный).
- в backgroundView снова не изменяется (поэтому анимация выглядит как кроссфейд между selectedBackgroundView и backgroundView)
- только после того, как анимация закончилась, contentView перерисовывается в состояние "Не выбрано", и его фоновый цвет subview снова становится видимым (это может привести к тому, что ваша анимация будет выглядеть ужасно, поэтому рекомендуется не использовать UIView.фон на Вашей странице просмотр содержимого)
эти ответы приводят к тому, что выделенный rect перезаписывается разделителем, который вы добавляете в свою ячейку (по крайней мере, на iOS 6 с моим тестированием). Вам нужно установить
separatorColor
to[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, чтобы создать настраиваемое представление изображения в 1 пиксель по высоте и ширине 200 пикселей для everyCellUIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 200, self.view.bounds.size.width, 1)]; lineView.backgroundColor = [UIColor blackColor]; [cell.contentView addSubview:lineView];
Примечание: Я не знаю, насколько это тяжело на производительность.
Я не знаю, если это может быть сделано "автоматически" с некоторых настроек. Но предложение состояло бы в том, чтобы установить разделитель линий как none, а в границах ваших ячеек фактически нарисовать разделитель линий, который вы хотите..
Если вы используете пользовательские ячейки в 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 ниже является подклассом UITableViewCell, где каждая ячейка может иметь свой собственный разделитель с множеством стилей (в настоящее время только .Нет и нет .По умолчанию поддерживаются). Он написан на Swift и предполагает использование автозапуска.
https://gist.github.com/evgeniyd/fa36b6f586a5850bca3f
как использовать класс:
установите стиль разделителя объекта UITableView в
UITableViewCellSeparatorStyle.None
tableView.separatorStyle = .None
создать подкласс
MPSTableViewCell
- где-то внутри
awakeFromNib()
установить стиль сепаратора ячейкиПримечание: приведенный ниже код предполагает, что ячейка загружается из xib / storyboard
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. Используя autolayout, я установил левое ограничение на 12, нижнее ограничение на 0, правое ограничение на 0 и высоту на 1.
Swift версия:
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) } }