Подтвердить что ты не робот

Как увеличить высоту сепаратора UITableView?

Мне нужно больше пространства (10 пикселей) между каждым cell. Как я могу это сделать?

И я добавил этот код

tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
4b9b3361

Ответ 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.