Как настроить разделитель таблицы в iPhone

По умолчанию в uitableview есть разделитель одной строки.

Но я хочу поставить свою настроенную строку как разделитель.

Возможно ли это? Как?

Ответ 1

Если вы хотите сделать больше, чем просто изменить цвет разделителя, используя свойство separatorColor property of the UITableView, тогда вы можете установить для свойства separatorStyle значение UITableViewCellSeparatorStyleNone., а затем либо:

  • создать пользовательский UITableViewCell, в который будет включен ваш собственный разделитель
  • создать альтернативные [UITableViewCell] [6], которые включают ваш собственный разделитель

Например, если ваша таблица в настоящее время отображает 5 строк, вы можете обновить ее, чтобы отобразить 9 строк, а строки с индексами 1, 3, 5, 7 будут ячейками-разделителями.

Ответ 2

Лучшим решением является использование ширины и высоты тока ячейки. Что-то вроде этого:

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];

Ответ 3

Если вам нужны разные цвета 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];

Это предполагает, что цвет фона вашей ячейки прозрачен.


Вышеупомянутое решение вышло из некоторых обширных экспериментов. Вот некоторые заметки о моих выводах, которые, я уверен, помогут людям:

В обычном "не выбранном" состоянии

  • ContentView (что в вашем XIB, если вы его не закодировали иначе) обычно рисуется
  • SelectedBackgroundView HIDDEN
  • Фоновый вид виден (при условии, что ваш контентный вид прозрачен, вы видите backgroundView или (если вы еще не определили backgroundView, вы увидите цвет фона самого UITableView)

Выбирается ячейка, сразу же происходит с-OUT любая анимация:

  • Все представления/подзаголовки в contentView имеют свой backgroundColor, очищенный (или установленный на прозрачность), изменение цвета текста метки и т.д. с их выбранным цветом.
  • ВыбранныйBackgroundView становится видимым (это представление всегда является полным размером ячейки (пользовательский фрейм игнорируется, если вам нужно его использовать), также обратите внимание, что backgroundColor подвидных окон по какой-либо причине не отображается, возможно, re установить прозрачно, как contentView). Если вы не определили selectedBackgroundView, то Cocoa создаст/вставляет синий (или серый) фон градиента и отображает это для вас)
  • Фоновый экран не изменяется

Когда ячейка отменяется, анимация для удаления подсветки начинается:

  • Выбранное свойство alphaBackgroundView анимируется от 1.0 (полностью непрозрачное) до 0.0 (полностью прозрачно).
  • Фоновый экран снова не изменился (поэтому анимация выглядит как кроссфейд между выбраннымBackgroundView и backgroundView)
  • Только после завершения анимации ContentView будет перерисовываться в "не выбранном" состоянии, а его subview backgroundColor снова станет видимым (это может привести к тому, что ваша анимация выглядит ужасной, поэтому желательно, чтобы вы не использовали UIView. backgroundColor в вашем contentView)

Ответ 4

Эти ответы приводят к тому, что подсветка 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;
}

Ответ 5

Вы добавляете следующий код 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];

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

Ответ 6

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

Ответ 7

Если вы используете пользовательские ячейки в 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 строки.

Ответ 8

На экране сетчатки даже рисование линии с 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];

Ответ 9

Протестировано на 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.

Ответ 10

Ниже в ячейке находится подкласс 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
     }

     // ...

     }

Ответ 11

Если вы используете настраиваемый UITableViewCell, вы можете просто добавить UIView в нижней части UItableViewCell.xib и поместить цвет фона в желаемый цвет.

Например, на xib я добавляю UIView в нижней части и устанавливаю высоту как 1. Используя автозапуск, я устанавливаю левое ограничение на 12, нижнее ограничение на 0, правое ограничение на 0 и высоту до 1.

Ответ 12

Быстрая версия:

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