Как увеличить высоту сепаратора UITableView?
Мне нужно больше пространства (10 пикселей) между каждым cell
. Как я могу это сделать?
И я добавил этот код
tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
Ответы
Ответ 1
Я не думаю, что это возможно с использованием стандартного API. Я думаю, вам нужно подклассифицировать UITableViewCell и добавить представление, которое имитирует разделитель в нижней части ячейки.
Вы можете проверить этот вопрос, он кажется связанным и содержит пример кода:
iPhone + UITableView + поместите изображение для разделителя
Ответ 2
Лучший способ для меня, просто добавить это в cellForRowAtIndexPath или в willDisplayCell
CGRect sizeRect = [UIScreen mainScreen].applicationFrame;
NSInteger separatorHeight = 3;
UIView * additionalSeparator = [[UIView alloc] initWithFrame:CGRectMake(0,cell.frame.size.height-separatorHeight,sizeRect.size.width,separatorHeight)];
additionalSeparator.backgroundColor = [UIColor grayColor];
[cell addSubview:additionalSeparator];
Для Swift 3.0:
let screenSize = UIScreen.main.bounds
let separatorHeight = CGFloat(3.0)
let additionalSeparator = UIView.init(frame: CGRect(x: 0, y: self.frame.size.height-separatorHeight, width: screenSize.width, height: separatorHeight))
additionalSeparator.backgroundColor = UIColor.gray
self.addSubview(additionalSeparator)
Вы должны добавить это в метод ячейки awakeFromNib(), чтобы избежать повторного создания.
Ответ 3
Я видел много неуклюжих решений, таких как подклассы UITableView
со скрытыми ячейками и другие менее оптимальные, в том числе. в этой теме.
При инициализации UITableView
установите для свойства rowHeight
значение UITableView
значение, равное = высота ячейки + желаемая высота разделителя/пространства.
Не используйте стандартный класс UITableViewCell
, но вместо этого подклассифицируйте класс UITableViewCell
и переопределите его метод layoutSubviews
. Там, вызывая super
(не забывайте об этом), установите высоту самой ячейки на нужную высоту.
ОБНОВЛЕНИЕ БОНУС 18/OCT/2015:
Вы можете быть немного умнее об этом. Решение выше в основном помещает "разделитель" в нижнюю часть ячейки. Что действительно происходит, высота строки управляется TableViewController, но ячейка изменена, чтобы быть немного ниже. Это приводит к тому, что разделитель/пустое пространство находится внизу. Но вы можете также центрировать все подпункты вертикально, чтобы вы оставили одно и то же пространство сверху и снизу. Например, 1pt и 1pt.
Вы также можете создать свойства isFirst, isLast удобства в вашем подклассе ячейки. Вы должны установить их в yes в cellForRowAtIndexPath.
Таким образом, вы можете обрабатывать граничные случаи для верхнего и нижнего разделителей внутри метода layoutSubviews, так как это будет иметь доступ к этим свойствам.
Таким образом, вы можете обрабатывать граничные шкафы сверху или снизу - потому что иногда отделу дизайна нужны N + 1 разделители, а количество ячеек - только N. Таким образом, вам приходится либо заниматься верхним, либо загрузочным способом особым образом, Но лучше всего делать это внутри ячеек вместо tableViewHeader или TableViewFooter.
Ответ 4
В Swift
Самый простой и самый короткий способ для меня заключался в том, чтобы добавить фрагмент ниже в cellForRowAtIndexPath
или в willDisplayCell
:
override func tableView(tableView: UITableView,
willDisplayCell cell: UITableViewCell,
forRowAtIndexPath indexPath: NSIndexPath)
{
let additionalSeparatorThickness = CGFloat(3)
let additionalSeparator = UIView(frame: CGRectMake(0,
cell.frame.size.height - additionalSeparatorThickness,
cell.frame.size.width,
additionalSeparatorThickness))
additionalSeparator.backgroundColor = UIColor.redColor()
cell.addSubview(additionalSeparator)
}
Ответ 5
Вы можете сделать это полностью в раскадровке. Вот как:
- перейдите в раскадровку и выберите tableview
- Покажите инспектору размера и оттуда установите высоту строки, чтобы сказать 140.
- затем покажите Инспектор атрибутов и оттуда установите разделитель в Single Line и Style Plain и выберите цвет
- затем в раскадровке (или в структуре документа) выберите ячейку
- и снова в Инспекторе размеров под панелью просмотра таблицы установите настраиваемую высоту строки, чтобы сказать 120.
Вот и все. Ваш разделитель будет составлять 20 единиц.
Ответ 6
Это довольно старый. Тем не менее я отправлю свой подход.
Просто немного увеличьте высоту ячейки и назначьте слой маски в ячейку, например:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "...", for: indexPath)
// Configure the cell...
let maskLayer = CAShapeLayer()
let bounds = cell.bounds
maskLayer.path = UIBezierPath(roundedRect: CGRect(x: 2, y: 2, width: bounds.width-4, height: bounds.height-4), cornerRadius: 5).cgPath
cell.layer.mask = maskLayer
return cell
}
Итак, в этом примере высота моего seperator будет 4.
Удачи!
Ответ 7
Вроде старая нить, но так как я нашел только хакерские решения в этой теме, вот решение, которое мне больше всего помогло (без дополнительного UIView в каждой ячейке)
Свифт 3:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//configure your cell...
cell.layer.shadowColor = UIColor.red.cgColor
cell.layer.shadowOffset = CGSize(width: 0, height: 1)
cell.layer.shadowOpacity = 1
cell.layer.shadowRadius = 0
cell.layer.masksToBounds = false
return cell
}
РЕДАКТИРОВАТЬ: К сожалению, это не работает, если вы прокрутите вверх в таблице. В любом случае, я оставляю здесь ответ, поскольку это может быть решением, если содержание вашей таблицы ограничено.
Смотрите Shadow на UITableViewCell исчезает при прокрутке для получения дополнительной информации.
Ответ 8
Для ячейки таблицы с высотой 50 и пространством 5 пикселей между строками. Ширина 320.
Определить фон ячеек:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
cell.backgroundColor = [UIColor clearColor];
}
Задайте высоту ячеек, это размер строки PLUS для разделителя:
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 55;
}
И определите в cellForRowAtIndexPath поле с размером строки (разделитель MINUS), чтобы нарисовать цвет фона:
UILabel *headerBackgroundLabel = [[UILabel alloc] initWithFrame:CGRectMake(0,0,320,50)];
backgroundBox.backgroundColor = [UIColor grayColor];
[cell addSubview:backgroundBox];
Ответ 9
Я делаю это гораздо проще и гибче. Некоторые могут назвать это взломом. Я называю это прагматичным.
Я скрываю стандартный UITableViewSeparator. Затем я добавляю subview в свою ячейку, используя автоматическую компоновку. Исправьте высоту, что я хочу. Прикрепите его к краям с краем с обеих сторон. Измените цвет фона. У меня есть простой разделитель с желаемой высотой.
Вы можете задаться вопросом, насколько эффективно это имеет другой UIView в иерархии ячеек. Действительно ли это будет иметь заметную разницу? Наверное, нет - вы все равно вывели стандартный разделитель из иерархии таблиц.
Ответ 10
Swift 4
Невозможно сделать разделитель по умолчанию выше. Вместо этого вам нужно добавить подпредставление, которое будет выглядеть как разделитель для каждой ячейки (и, необязательно, сделать ячейку выше). Вы можете сделать это, например, в cellForRowAtIndexPath
или в подклассе UITableViewCell
.
Если вы разрешите выбрать ячейку, вам также необходимо добавить подпредставление для выбранного состояния, в противном случае разделитель исчезнет при выборе ячейки. Вот почему selectedBackgroundView
также настроен.
Добавьте это в свой подкласс UITableViewController
:
override func viewDidLoad() {
super.viewDidLoad()
tableView.separatorStyle = .none
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.backgroundView = UIView(backgroundColor: .white)
cell.backgroundView?.addSeparator()
cell.selectedBackgroundView = UIView(backgroundColor: .blue)
cell.selectedBackgroundView?.addSeparator()
// configure the cell
return cell
}
Добавьте эти расширения в тот же файл внизу:
private extension UIView {
convenience init(backgroundColor: UIColor) {
self.init()
self.backgroundColor = backgroundColor
}
func addSeparator() {
let separatorHeight: CGFloat = 2
let frame = CGRect(x: 0, y: bounds.height - separatorHeight, width: bounds.width, height: separatorHeight)
let separator = UIView(frame: frame)
separator.backgroundColor = .gray
separator.autoresizingMask = [.flexibleTopMargin, .flexibleWidth]
addSubview(separator)
}
}
Ответ 11
Здесь вариант, который может работать для некоторых людей
cell.layer.borderColor = UIColor.white.cgColor
cell.layer.borderWidth = 4.0
cell.layer.masksToBounds = true
Ответ 12
Самое простое и безопасное решение этой проблемы - отключить разделитель таблиц и использовать UITableViewCell в качестве разделителя переменной высоты. Конечно, вам придется сделать некоторую математическую задачу, чтобы выяснить, где находятся предметы, но на самом деле это нечетно/четно.
Он не сломается, и вы получите выгоду от утилизируемых ячеек (без посторонних взглядов для очистки).
Ответ 13
Это самое простое решение, которое я нашел:
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
" "
}
затем просто установите высоту на то, что вы хотите:
tableView.sectionHeaderHeight = 30.0
Ответ 14
Для Swift 4
Реализовано решение King-Wizard для Swift 4:
public func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let additionalSeparatorThickness = CGFloat(4)
let additionalSeparator = UIView(frame: CGRect(x: 0,
y: cell.frame.size.height - additionalSeparatorThickness, width: cell.frame.size.width, height: additionalSeparatorThickness))
additionalSeparator.backgroundColor = UIColor.groupTableViewBackground
cell.addSubview(additionalSeparator)
}
Ответ 15
Я наткнулся на то, что позволило мне эффективно изменить разрыв между ячейками.
В построителе интерфейса я установил высоту строки 46.
В методе cellForRowAtIndexPath
моего делегата TableView я устанавливаю кадр ячейки как меньшее значение.
cell.frame=CGRectMake(44,0,tableView.bounds.size.width,44)
Это дает мне ячейку с высотой 44, которая соответствует ширине таблицыView, но пространство, предоставленное для строки, будет 46, как определено в IB.
Я все равно заполнял ячейку программно, так что это мне очень понравилось.
Ответ 16
Вы должны реализовать
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
метод делегата. и верните 100.0.