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


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

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

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

12 64

12 ответов:

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

  • создать кастом UITableViewCells, которые включают в себя ваш пользовательский разделитель внутри них
  • создать альтернативный UITableViewCells, которые включают в себя ваш пользовательский разделитель

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

посмотреть Подкласс UITableViewCell на Руководство По Программированию В Виде Таблицы для получения дополнительной информации о том, как создавать пользовательские UITableViewCell s.

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

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

Если вам нужны разные цвета разделителя для разных строк или вы хотите, чтобы разделитель оставался видимым, когда строка выделена на кране, попробуйте следующее:

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's 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 скрыт
  • backgroundView виден (поэтому, если ваш contentView прозрачен, вы видите backgroundView или (если вы не определили backgroundView, вы увидите цвет фона самого UITableView)

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

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

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

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

эти ответы приводят к тому, что выделенный rect перезаписывается разделителем, который вы добавляете в свою ячейку (по крайней мере, на iOS 6 с моим тестированием). Вам нужно установить separatorColor to [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;
}

добавить следующий код cellForRowAtIndexPath делегат TableView, чтобы создать настраиваемое представление изображения в 1 пиксель по высоте и ширине 200 пикселей для everyCell

UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 200, self.view.bounds.size.width, 1)];
lineView.backgroundColor = [UIColor blackColor];
[cell.contentView addSubview:lineView];

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

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

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

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

протестировано на 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, а также.

ячейка в gist ниже является подклассом UITableViewCell, где каждая ячейка может иметь свой собственный разделитель с множеством стилей (в настоящее время только .Нет и нет .По умолчанию поддерживаются). Он написан на Swift и предполагает использование автозапуска.

https://gist.github.com/evgeniyd/fa36b6f586a5850bca3f

как использовать класс:

  1. установите стиль разделителя объекта UITableView в UITableViewCellSeparatorStyle.None

    tableView.separatorStyle = .None
    
  2. создать подкласс MPSTableViewCell

  3. где-то внутри awakeFromNib() установить стиль сепаратора ячейки

Примечание: приведенный ниже код предполагает, что ячейка загружается из xib / storyboard

    class FASWorkoutCell: FASTableViewCell {

    required init(coder aDecoder: NSCoder) {
         super.init(coder: aDecoder)
     }

     override func awakeFromNib() {
         super.awakeFromNib()

         separatorType = .Default
     }

     // ...

     }

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

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

Swift версия:

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