it-swarm.com.ru

Как установить полную ширину разделителя в UITableView

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

self.tableView.layoutMargins = UIEdgeInsetsZero;

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

Как же я могу это исправить?

Спасибо за помощь

133
Timo Cengiz

Хорошо, я нашел ответ. Не знаю, почему я не сталкивался с этим постом раньше, но, конечно же, после того, как вы разместите вопрос, вдруг перед вами появится нужное сообщение. Я получил ответ из этого поста: iOS 8 UITableView разделитель 0 не работает

Просто добавьте этот код на ваше TableViewController

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [self.tableView setLayoutMargins:UIEdgeInsetsZero];
    }
}
102
Timo Cengiz

Это работало для меня на устройствах iOS 8.4 - 9.0, использующих Xcode 6.4 и Swift 1.2:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = UITableViewCell()


    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero

    return cell
}

Swift 3. Обновление

cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero
206
MB_iOSDeveloper

В вашем UITableViewCell

Перейдите к Инспектору Атрибутов в Интерфейсном Разработчике и просто измените "15" на 0. Сделайте это для всех ячеек, которые вы хотите изменить.

instets

Возможно, вам придется добавить [cell setLayoutMargins:UIEdgeInsetsZero]; к вашему tableViewCell

90
Hannah Louisa Carney

для Swift 3:

override func viewDidLoad() {
  super.viewDidLoad()

  tableView.separatorInset = .zero
  tableView.layoutMargins = .zero
}
20
Wilson

Я наследую от UITableViewController, и мне потребовались дополнительные настройки для двух вставок в willDisplayCell, чтобы также установить для preservesSuperviewLayoutMargins значение false. В Swift это выглядит так:

override func tableView(_tableView: UITableView,
    willDisplayCell cell: UITableViewCell,
    forRowAtIndexPath indexPath: NSIndexPath) {

        if cell.respondsToSelector("setSeparatorInset:") {
            cell.separatorInset = UIEdgeInsetsZero
        }
        if cell.respondsToSelector("setLayoutMargins:") {
            cell.layoutMargins = UIEdgeInsetsZero
        }
        if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
            cell.preservesSuperviewLayoutMargins = false
        }
}
19
H6.
  1. Выберите вас UITableViewCell
  2. Перейти к Инспектору атрибутов
  3. Перейдите в разделитель и измените его на "пользовательские вставки"
  4. Задайте поля left и/или right. (По умолчанию left: 15, right: 0)

Посмотрите, как это работает для меня (используя left: 100):

enter image description here

Результат:

enter image description here

17
Sebastián Lara

Для людей, имеющих проблемы с iPad - это приведет вас в такое же состояние, как iPhone. Затем вы можете отрегулировать separatorInset по мере необходимости.

tableView.cellLayoutMarginsFollowReadableWidth = false
9
Michael Rose

для Swift в iOS 9+

если используется пользовательское UITableViewCell:

override var layoutMargins: UIEdgeInsets {
    get { return UIEdgeInsetsZero }
    set(newVal) {}
}

затем для вашего tableView в viewDidLoad:

    self.tableView?.separatorInset = UIEdgeInsetsZero;
    self.tableView?.layoutMargins = UIEdgeInsetsZero;
8
Christopher Larsen

Протестировано для iOS 9.3 & Swift 2.2. Обязательно поместите код в willDisplayCell, который вызывается непосредственно перед отображением ячейки, а не в cellForRowAtIndexPath, где вы создаете только ячейку.

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero
}

Добавьте override в функцию для UITableViewController, например, так: override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

8
oyalhi

Разделитель Inset по умолчанию 15 слева. Измените параметр Inset разделителя с auto на custom и установите для вставки 0.

enter image description here

7
Ramin

Используйте его в методе cellForRowAtIndexPath, чтобы настроить спецификации разделителя ячейки,
отлично работает на iOS9.0 +

 cell.separatorInset = UIEdgeInsetsZero;
 cell.layoutMargins = UIEdgeInsetsZero;
 cell.preservesSuperviewLayoutMargins = NO;
6
Aks

Ничто из вышеперечисленного не помогло мне в Swift 2.2 и Xcode 7.3.1

Оказалось, самое простое решение из всех. Код не нужен. Просто измените TableViewCell значения полей макета в инспекторе UITableView:

5
aurawindsurfing

Для Swift 3:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
            cell.separatorInset = UIEdgeInsets.zero
        }
        if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
            cell.layoutMargins = UIEdgeInsets.zero
        }
        if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
            cell.preservesSuperviewLayoutMargins = false
        }
    }
4
Giulio Colleluori

Ни одно из этих решений не работает на iPad, но я предложил решение, которое охватывает оба устройства:

с многоразовыми ячейками:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    ...[other code]...
    [cell setLayoutMargins:UIEdgeInsetsZero];
    [cell setSeparatorInset:UIEdgeInsetsZero];
    return cell;
}

с ячейками без возможности повторного использования:

- (void)removeSeparatorInset:(UITableView*)tableView{
    NSArray *cells = [tableView visibleCells];
    for (UITableViewCell *cell in cells){
        [cell setLayoutMargins:UIEdgeInsetsZero];
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
}

-(void) viewDidLayoutSubviews{
   [super viewDidLayoutSubviews];
   [self removeSeparatorInset:self.tableView];
}

Просто чтобы расширить этот подход:

@property(nonatomic) UIEdgeInsets separatorInset;
@property(nonatomic) UIEdgeInsets layoutMargins;

Оба свойства могут использоваться UITableView & UITableViewCell. Последний, по сути, является свойством UIView, который является родительским классом для UITableView и UITableViewCell.

0
Charles Robertson

В viewDidLoad (проверено iOS11 - Swift 4.1)

пытаться

tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)

0
Giang