По умолчанию в uitableview есть разделитель одной строки.
Но я хочу поставить свою настроенную строку как разделитель.
Возможно ли это? Как?
По умолчанию в uitableview есть разделитель одной строки.
Но я хочу поставить свою настроенную строку как разделитель.
Возможно ли это? Как?
Если вы хотите сделать больше, чем просто изменить цвет разделителя, используя свойство separatorColor property of the UITableView, тогда вы можете установить для свойства separatorStyle значение UITableViewCellSeparatorStyleNone., а затем либо:
Например, если ваша таблица в настоящее время отображает 5 строк, вы можете обновить ее, чтобы отобразить 9 строк, а строки с индексами 1, 3, 5, 7 будут ячейками-разделителями.
Лучшим решением является использование ширины и высоты тока ячейки. Что-то вроде этого:
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 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];
Это предполагает, что цвет фона вашей ячейки прозрачен.
Вышеупомянутое решение вышло из некоторых обширных экспериментов. Вот некоторые заметки о моих выводах, которые, я уверен, помогут людям:
В обычном "не выбранном" состоянии
Выбирается ячейка, сразу же происходит с-OUT любая анимация:
Когда ячейка отменяется, анимация для удаления подсветки начинается:
Эти ответы приводят к тому, что подсветка 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
делегат таблицыView для создания пользовательского представления изображения высоты 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.
Ниже в ячейке находится подкласс UITableViewCell, где каждая ячейка может иметь свой собственный разделитель w/many styles (в настоящее время поддерживаются только .None и .Default). Он написан в Swift и предполагает использование Autolayout.
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. Используя автозапуск, я устанавливаю левое ограничение на 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)
}
}