Как увеличить высоту разделителя UITableView? - PullRequest
47 голосов
/ 19 августа 2010

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

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

tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

Ответы [ 16 ]

25 голосов
/ 08 января 2015

Лучший способ для меня, просто добавить это в 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 (), чтобы избежать повторного создания.

22 голосов
/ 17 января 2014

Я видел много неуклюжих решений, таких как подклассы UITableView со скрытыми ячейками, и другие, менее оптимальные, в том числе.в этой теме.

При инициализации UITableView установите для свойства rowHeight UITableView высоту, равную = высоте ячейки + желаемый разделитель / высота пространства.

Не использовать стандартные UITableViewCell class, однако, вместо этого создайте подкласс класса UITableViewCell и переопределите его layoutSubviews метод.Там, после вызова super (не забудьте об этом), установите высоту самой ячейки на желаемую высоту.

ОБНОВЛЕНИЕ БОНУСА 18 ОКТЯБРЯ / 2015:

Вы можете бытьнемного умный об этом.Решение выше в основном помещает «разделитель» в нижней части ячейки.Что действительно происходит, так это то, что высота строки управляется TableViewController, но размер ячейки изменяется немного ниже.Это приводит к тому, что разделитель / пустое пространство находятся внизу.Но вы также можете центрировать все подпредставления вертикально, чтобы оставить одинаковое пространство сверху и снизу.Например, 1pt и 1pt.

Вы также можете создать удобные свойства isFirst, isLast для своего подкласса ячеек.Вы должны установить их в yes в cellForRowAtIndexPath.Таким образом, вы можете обрабатывать крайние случаи для верхнего и нижнего разделителей внутри метода layoutSubviews, так как это будет иметь доступ к этим свойствам.Таким образом, вы можете обрабатывать крайние случаи для верхнего или нижнего - потому что иногда отдел дизайна хочет разделить N + 1, в то время как количество ячеек равно только N. Поэтому вы должны иметь дело либо с верхним, либо с загрузочным, особым образом,Но лучше делать это внутри ячеек, а не tableViewHeader или TableViewFooter.

11 голосов
/ 19 августа 2010

Я не думаю, что это возможно при использовании стандартного API. Я думаю, вам нужно будет создать подкласс UITableViewCell и добавить представление, которое имитирует разделитель в нижней части ячейки.

Вы можете проверить этот вопрос, он кажется связанным и имеет некоторый пример кода: iPhone + UITableView + разместить изображение для разделителя

7 голосов
/ 30 июня 2015

In 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)
}
6 голосов
/ 08 августа 2014

Вы можете сделать это полностью в раскадровке. Вот как:

  • перейдите на раскадровку и выберите вид таблицы
  • Показать инспектор размера и оттуда установить высоту строки, скажем, 140.
  • , затем покажите инспектор атрибутов и оттуда установите разделитель на Однолинейный и Простой стиль и выберите цвет
  • затем в раскадровке (или в структуре документа) выберите ячейку
  • и снова в инспекторе размеров под ячейкой табличного представления установите настраиваемую высоту строки, скажем, 120.

Вот и все. Ваш разделитель будет иметь высоту 20 единиц.

4 голосов
/ 30 сентября 2016

это довольно старый. Тем не менее я опубликую свой подход.

Просто немного увеличьте высоту вашей ячейки и присвойте ей слой маски, например:

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
}

Так что в этом примере высота моего разделителя будет 4.

Веселись!

3 голосов
/ 27 февраля 2018

Вроде старая тема, но так как я нашел только хакерские решения в этой теме, вот решение, которое лучше всего для меня (без дополнительного UIView в каждой ячейке)

Swift 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
}

РЕДАКТИРОВАТЬ: К сожалению, это не работает, если вы прокрутите вверх в таблице.В любом случае, я оставляю здесь ответ, поскольку это может быть решением, если содержание вашей таблицы ограничено.

См. Тень на UITableViewCell исчезает при прокрутке для получения дополнительной информации.

2 голосов
/ 02 октября 2013

Для ячейки таблицы с высотой 50 и расстоянием между строками 5 пикселей. Ширина 320.

Определите фон ячеек, чтобы быть ясными:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = [UIColor clearColor];
}

Установите высоту ячеек, это размер строки плюс разделитель:

-(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];
1 голос
/ 10 декабря 2014

Я делаю это намного проще и гибче.Некоторые могут назвать это взломом.Я называю это прагматичным.

Я скрываю стандартный UITableViewSeparator.Затем я добавляю подпредставление в свою ячейку, используя автоматическую разметку, прикрепляю его вверхЗафиксируйте высоту на то, что я желаю.Прикрепите его к краям с полями с обеих сторон.Измените его цвет фона.У меня есть простой разделитель с желаемой высотой.

Вы можете спросить, насколько эффективно это имеет другой UIView в иерархии ячеек.Это действительно будет иметь заметное значение?Возможно, нет - вы все равно просто удалили стандартный разделитель из иерархии таблиц.

0 голосов
/ 23 мая 2019

Это самое простое решение, которое я нашел:

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    " "
}

, затем просто установите высоту на то, что вы хотите:

tableView.sectionHeaderHeight = 30.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...