Мне нужно больше пространства (10 пикселей) между каждым cell
. Как я могу это сделать?
И я добавил этот код
tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
Мне нужно больше пространства (10 пикселей) между каждым cell
. Как я могу это сделать?
И я добавил этот код
tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
Я не думаю, что это возможно с использованием стандартного API. Я думаю, вам нужно подклассифицировать UITableViewCell и добавить представление, которое имитирует разделитель в нижней части ячейки.
Вы можете проверить этот вопрос, он кажется связанным и содержит пример кода: iPhone + UITableView + поместите изображение для разделителя
Лучший способ для меня, просто добавить это в 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(), чтобы избежать повторного создания.
Я видел много неуклюжих решений, таких как подклассы UITableView
со скрытыми ячейками и другие менее оптимальные, в том числе. в этой теме.
При инициализации UITableView
установите для свойства rowHeight
значение UITableView
значение, равное = высота ячейки + желаемая высота разделителя/пространства.
Не используйте стандартный класс UITableViewCell
, но вместо этого подклассифицируйте класс UITableViewCell
и переопределите его метод layoutSubviews
. Там, вызывая super
(не забывайте об этом), установите высоту самой ячейки на нужную высоту.
ОБНОВЛЕНИЕ БОНУС 18/OCT/2015:
Вы можете быть немного умнее об этом. Решение выше в основном помещает "разделитель" в нижнюю часть ячейки. Что действительно происходит, высота строки управляется TableViewController, но ячейка изменена, чтобы быть немного ниже. Это приводит к тому, что разделитель/пустое пространство находится внизу. Но вы можете также центрировать все подпункты вертикально, чтобы вы оставили одно и то же пространство сверху и снизу. Например, 1pt и 1pt.
Вы также можете создать свойства isFirst, isLast удобства в вашем подклассе ячейки. Вы должны установить их в yes в cellForRowAtIndexPath. Таким образом, вы можете обрабатывать граничные случаи для верхнего и нижнего разделителей внутри метода layoutSubviews, так как это будет иметь доступ к этим свойствам. Таким образом, вы можете обрабатывать граничные шкафы сверху или снизу - потому что иногда отделу дизайна нужны N + 1 разделители, а количество ячеек - только N. Таким образом, вам приходится либо заниматься верхним, либо загрузочным способом особым образом, Но лучше всего делать это внутри ячеек вместо tableViewHeader или TableViewFooter.
В 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)
}
Вы можете сделать это полностью в раскадровке. Вот как:
Вот и все. Ваш разделитель будет составлять 20 единиц.
Это довольно старый. Тем не менее я отправлю свой подход.
Просто немного увеличьте высоту ячейки и назначьте слой маски в ячейку, например:
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.
Удачи!
Вроде старая нить, но так как я нашел только хакерские решения в этой теме, вот решение, которое мне больше всего помогло (без дополнительного 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 исчезает при прокрутке для получения дополнительной информации.
Для ячейки таблицы с высотой 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];
Я делаю это гораздо проще и гибче. Некоторые могут назвать это взломом. Я называю это прагматичным.
Я скрываю стандартный UITableViewSeparator. Затем я добавляю subview в свою ячейку, используя автоматическую компоновку. Исправьте высоту, что я хочу. Прикрепите его к краям с краем с обеих сторон. Измените цвет фона. У меня есть простой разделитель с желаемой высотой.
Вы можете задаться вопросом, насколько эффективно это имеет другой UIView в иерархии ячеек. Действительно ли это будет иметь заметную разницу? Наверное, нет - вы все равно вывели стандартный разделитель из иерархии таблиц.
Невозможно сделать разделитель по умолчанию выше. Вместо этого вам нужно добавить подпредставление, которое будет выглядеть как разделитель для каждой ячейки (и, необязательно, сделать ячейку выше). Вы можете сделать это, например, в 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)
}
}
Здесь вариант, который может работать для некоторых людей
cell.layer.borderColor = UIColor.white.cgColor
cell.layer.borderWidth = 4.0
cell.layer.masksToBounds = true
Самое простое и безопасное решение этой проблемы - отключить разделитель таблиц и использовать UITableViewCell в качестве разделителя переменной высоты. Конечно, вам придется сделать некоторую математическую задачу, чтобы выяснить, где находятся предметы, но на самом деле это нечетно/четно.
Он не сломается, и вы получите выгоду от утилизируемых ячеек (без посторонних взглядов для очистки).
Это самое простое решение, которое я нашел:
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
" "
}
затем просто установите высоту на то, что вы хотите:
tableView.sectionHeaderHeight = 30.0
Для 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)
}
Я наткнулся на то, что позволило мне эффективно изменить разрыв между ячейками.
В построителе интерфейса я установил высоту строки 46.
В методе cellForRowAtIndexPath
моего делегата TableView я устанавливаю кадр ячейки как меньшее значение.
cell.frame=CGRectMake(44,0,tableView.bounds.size.width,44)
Это дает мне ячейку с высотой 44, которая соответствует ширине таблицыView, но пространство, предоставленное для строки, будет 46, как определено в IB.
Я все равно заполнял ячейку программно, так что это мне очень понравилось.
Вы должны реализовать
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
метод делегата. и верните 100.0.