Скрыть разделительную линию на одном UITableViewCell


250

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

Я знаю, что могу сделать, tableView.separatorStyle = UITableViewCellStyle.Noneно это повлияет на все ячейки tableView. Я хочу, чтобы это затронуло только мою последнюю камеру.



Ваш вопрос ответил на мой. tableView.separatorStyle = UITableViewCellStyle.None была нужной мне строкой
Малахи Холден

Ответы:


371

в viewDidLoad, добавьте эту строку:

self.tableView.separatorColor = [UIColor clearColor];

и в cellForRowAtIndexPath:

для iOS более низких версий

if(indexPath.row != self.newCarArray.count-1){
    UIImageView *line = [[UIImageView alloc] initWithFrame:CGRectMake(0, 44, 320, 2)];
    line.backgroundColor = [UIColor redColor];
    [cell addSubview:line];
}

для верхних версий iOS 7 (включая iOS 8)

if (indexPath.row == self.newCarArray.count-1) {
    cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}

4
Это будет работать на iOS7 и iOS8. Это эффективно сжимает разделитель до нуля. cell.separatorInset = UIEdgeInsetsMake (0, CGRectGetWidth (cell.bounds) /2.0, 0, CGRectGetWidth (cell.bounds) /2.0)
Харрис

9
Одно напоминание: если iDevice - это iPad, а в ячейке используется AutoLayout, значение, возвращаемое «cell.bounds.size.width», может не совпадать с фактической шириной ячейки. Поэтому я всегда использую «tableView.frame.size.width» вместо «cell.bounds.size.width».
Вей Чжоу

5
Обратите внимание: вы должны использовать [cell.contentView addSubview:line]вместо[cell addSubview:line]
Анастасия

6
изменение левой вставки cell.separatorInset также изменит левую вставку содержимого ячейки. Не только разделительная линия. Из документа Apple: «Вы можете использовать это свойство, чтобы добавить пространство между содержимым текущей ячейки и левым и правым краями таблицы. Положительные значения вставки перемещают содержимое ячейки и разделитель ячеек внутрь и от краев таблицы».
zgjie

9
Плохая идея. Вы никогда не должны добавлять подпредставления в ячейку cellForRowAtIndexPath. Помните, что клетки используются повторно. Каждый раз, когда эта ячейка используется повторно, вы добавляете другой вид разделительной линии. В больших списках это может повлиять на производительность прокрутки. И это просто не правильный способ сделать это.
Дэйв Баттон

247

Вы можете использовать следующий код:

Свифт:

if indexPath.row == {your row number} {
    cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: .greatestFiniteMagnitude)
}

или :

cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, UIScreen.main.bounds.width)

по умолчанию Margin:

cell.separatorInset = UIEdgeInsetsMake(0, tCell.layoutMargins.left, 0, 0)

показать разделитель сквозной

cell.separatorInset = .zero

Objective-C:

if (indexPath.row == {your row number}) {
    cell.separatorInset = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, CGFLOAT_MAX);
}

Не работает для сгруппированных UITableView, в то время как принятый ответ работает.
Алекс Н.

3
Это не работает для iOS9, self.tableView.separatorColor = [UIColor clearColor];исправлено.
Бен

1
Это полный взлом, но в iOS 9 работает следующее: cell.layoutMargins = UIEdgeInsetsZero; cell.separatorInset = UIEdgeInsetsMake (0, 0, 0, 9999)
Пэт Нимейер

Вот как это работает для меня в iOS 8+: cell.separatorInset = UIEdgeInsetsMake(0.f, 0.f, 0.f, cell.bounds.size.width-cell.layoutMargins.left);если я не вычту значение cell.layoutMargins.left, разделительная линия будет проведена от левой границы до левой границы (если есть).
Alexandre OS

3
Это отталкивает любого textLabelза кадром.
aehlke

99

Чтобы продолжить ответ Хирен .

в ViewDidLoad и следующей строке:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

Или, если вы используете XIB или раскадровки, замените « разделитель » на « нет »:

Интерфейсный конструктор

И в CellForRowAtIndexPath добавьте это:

CGFloat separatorInset; // Separator x position 
CGFloat separatorHeight; 
CGFloat separatorWidth; 
CGFloat separatorY; 
UIImageView *separator;
UIColor *separatorBGColor;

separatorY      = cell.frame.size.height;
separatorHeight = (1.0 / [UIScreen mainScreen].scale);  // This assures you to have a 1px line height whatever the screen resolution
separatorWidth  = cell.frame.size.width;
separatorInset  = 15.0f;
separatorBGColor  = [UIColor colorWithRed: 204.0/255.0 green: 204.0/255.0 blue: 204.0/255.0 alpha:1.0];

separator = [[UIImageView alloc] initWithFrame:CGRectMake(separatorInset, separatorY, separatorWidth,separatorHeight)];
separator.backgroundColor = separatorBGColor;
[cell addSubView: separator];

Вот пример результата, в котором я отображаю табличное представление с динамическими ячейками (но имею только одно с содержимым). В результате, только один из них имеет разделитель, а не все «фиктивные» таблицы автоматически добавляются для заполнения экрана.

введите описание изображения здесь

Надеюсь это поможет.

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

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.tableFooterView = UIView()
}

Я думаю, чтобы скрыть разделительную линию, это правильный подход. self.tableView.separatorStyle = .none
arango_86

52

Если вы не хотите рисовать разделитель самостоятельно, используйте это:

  // Hide the cell separator by moving it to the far right
  cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);

Этот API доступен только начиная с iOS 7.


8
separatorInsetкажется, вставляет содержимое ячейки, а также разделитель, требуя еще одного взлома для компенсации:cell.IndentationWidth = -10000;
crishoj

23
Лучшим методом является установка separatorInset0 для верхнего, левого и нижнего и ширины ячейки для правого: cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, cell.bounds.size.width); это позволяет избежать необходимости настраивать любые другие свойства ячейки.
bryguy1300 30.09.13

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

Обратите внимание, что если ячейка, для которой вы делаете это, будет повторно использована для рисования другой ячейки, для которой вы не собирались скрывать разделитель, разделитель также будет удален из него.
Майкл Петерсон

1
UIEdgeInsetsMake (0, 10000, 0, 0); работало -> UIEdgeInsetsMake (0, 0, 0, cell.bounds.size.width); не. думаю, это потому, что у меня есть неприятная привычка хранить видео размером 3,5 дюйма в XIB и стилбордах, из-за которых артефакты на устройствах 4 дюйма + приводят к 375-320px сечению = 55px остается. (голосом йоды) и очень уродливо!
Антон Тропашко

29

моя среда разработки

  • Xcode 7.0
  • 7A220 Swift 2.0
  • iOS 9.0

Приведенные выше ответы не работают для меня полностью

после попытки мое окончательно работающее решение:

let indent_large_enought_to_hidden:CGFloat = 10000
cell.separatorInset = UIEdgeInsetsMake(0, indent_large_enought_to_hidden, 0, 0) // indent large engough for separator(including cell' content) to hidden separator
cell.indentationWidth = indent_large_enought_to_hidden * -1 // adjust the cell's content to show normally
cell.indentationLevel = 1 // must add this, otherwise default is 0, now actual indentation = indentationWidth * indentationLevel = 10000 * 1 = -10000

и эффект: введите описание изображения здесь


20

Установите separatorInset.right = .greatestFiniteMagnitudeна свою камеру.


вызов этого awakeFromNibможет привести к тому, что весь экран будет мигатьapplicationDidBecomeActive
Breadbin

Это работает iOS 12.2, на устройстве, из программного создания UITableViewCell. Ницца.
Уомбл

Установка правильного разделителя работала для меня, когда я устанавливаю его в cellForRowAt. Лучшие решения. Это работает с iOS 10 до 13 для меня. Протестировано на iOS 10, 12 и 13. Когда задано левое поле, оно не работает на iOS 10.
Ариэль Богдзевич

18

В Swift 3, Swift 4 и Swift 5 вы можете написать расширение для UITableViewCell следующим образом:

extension UITableViewCell {
  func separator(hide: Bool) {
    separatorInset.left = hide ? bounds.size.width : 0
  }
}

Затем вы можете использовать это, как показано ниже (когда ячейка - это экземпляр вашей ячейки):

cell.separator(hide: false) // Shows separator 
cell.separator(hide: true) // Hides separator

Действительно лучше назначить ширину ячейки табличного представления в виде левой вставки, а не случайное число. Потому что в некоторых размерах экрана, возможно, не сейчас, но в будущем ваши разделители все еще будут видны, потому что этого случайного числа может быть недостаточно. Кроме того, в iPad в ландшафтном режиме вы не можете гарантировать, что ваши разделители всегда будут невидимыми.


Это не работает для сгруппированного стиля UITableView. У вас есть решение для группового случая?
Зславман

8

Лучшее решение для iOS 7 и 8

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    DLog(@"");
    if (cell && indexPath.row == 0 && indexPath.section == 0) {

        DLog(@"cell.bounds.size.width %f", cell.bounds.size.width);
        cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.0f);
    }
}

Если ваше приложение вращаемое - используйте 3000.0f для левой постоянной вставки или вычислите его на лету. Если вы попытаетесь установить правую вставку, у вас есть видимая часть разделителя на левой стороне ячейки на iOS 8.


1
Зачем использовать случайное число, если вы можете сделать что-то вроде этого: MAX ([[UIScreen mainScreen] bounds] .size.width, [[UIScreen mainScreen] bounds] .size.height); чтобы убедиться, что его всегда нет
Даниэль Галаско

7

В iOS 7 разделитель ячеек сгруппированных стилей UITableView выглядит немного иначе. Это выглядит примерно так:

введите описание изображения здесь

Я попробовал ответ Кеменарана сделать это:

cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);

Однако это не похоже на работу для меня. Я не уверен почему. Поэтому я решил использовать ответ Хирен , но UIViewвместо этого UIImageViewнарисовал линию в стиле iOS 7:

UIColor iOS7LineColor = [UIColor colorWithRed:0.82f green:0.82f blue:0.82f alpha:1.0f];

//First cell in a section
if (indexPath.row == 0) {

    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];

} else if (indexPath.row == [self.tableViewCellSubtitles count] - 1) {

    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];

    UIView *lineBottom = [[UIView alloc] initWithFrame:CGRectMake(0, 43, self.view.frame.size.width, 1)];
    lineBottom.backgroundColor = iOS7LineColor;
    [cell addSubview:lineBottom];
    [cell bringSubviewToFront:lineBottom];

} else {

    //Last cell in the table view
    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];
}

Если вы используете это, убедитесь, что вы указали правильную высоту представления таблицы во втором операторе if. Надеюсь это кому-нибудь пригодится.


7

В своем подклассе UITableViewCell переопределите layoutSubviews и скройте _UITableViewCellSeparatorView. Работает под iOS 10.

override func layoutSubviews() {
    super.layoutSubviews()

    subviews.forEach { (view) in
        if view.dynamicType.description() == "_UITableViewCellSeparatorView" {
            view.hidden = true
        }
    }
}

ни одно из вышеупомянутых решений не сработало, это работает на ios 12
Абдул Вахид

Это может быть отклонено из App Store для доступа к частным API.
Эллиот Фиске

5

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

if (indexPath.row == self.newCarArray.count-1) {
  cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}

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

Как-то так у меня сработало

if indexPath.row == franchises.count - 1 {
  cell.separatorInset = UIEdgeInsetsMake(0, cell.contentView.bounds.width, 0, 0)
} else {
  cell.separatorInset = UIEdgeInsetsMake(0, 0, cell.contentView.bounds.width, 0)
}

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


4

В Swift с использованием iOS 8.4 :

/*
    Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
                        willDisplayCell cell: UITableViewCell,
                        forRowAtIndexPath indexPath: NSIndexPath)
{
    if indexPath.row == 3 {
        // Hiding separator line for only one specific UITableViewCell
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
    }
}

Примечание: этот фрагмент выше будет работать на UITableView с использованием динамических ячеек. Единственная проблема, с которой вы можете столкнуться, это когда вы используете статические ячейки с категориями, тип разделителя, отличный от none, и сгруппированный стиль для табличного представления. Фактически, в данном конкретном случае он не будет скрывать последнюю ячейку каждой категории. Чтобы преодолеть это, я нашел решение установить нулевой разделитель ячеек (с помощью IB), а затем вручную создать (с помощью кода) свой вид строки для каждой ячейки. Для примера, пожалуйста, проверьте фрагмент ниже:

/*
Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
    willDisplayCell cell: UITableViewCell,
    forRowAtIndexPath indexPath: NSIndexPath)
{
    // Row 2 at Section 2
    if indexPath.row == 1 && indexPath.section == 1 {
        // Hiding separator line for one specific UITableViewCell
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)

        // Here we add a line at the bottom of the cell (e.g. here at the second row of the second section).
        let additionalSeparatorThickness = CGFloat(1)
        let additionalSeparator = UIView(frame: CGRectMake(0,
            cell.frame.size.height - additionalSeparatorThickness,
            cell.frame.size.width,
            additionalSeparatorThickness))
        additionalSeparator.backgroundColor = UIColor.redColor()
        cell.addSubview(additionalSeparator)
    }
}

В моем проекте это работает для статических ячеек, но не для динамических. В последнем случае содержимое последней ячейки смещается вправо (точно так же, как разделительная линия). Есть идеи, почему это может произойти?
Бастиан

Первый фрагмент ответа выше будет работать на UITableView с использованием динамических ячеек. Единственная проблема, с которой вы можете столкнуться, это когда вы используете статические ячейки с категориями, тип разделителя, отличный от none, и сгруппированный стиль для табличного представления. Фактически, в данном конкретном случае он не будет скрывать последнюю ячейку каждой категории. Чтобы преодолеть это, я нашел решение установить нулевой разделитель ячеек (с помощью IB), а затем вручную создать (с помощью кода) свой вид строки для каждой ячейки. Для примера, пожалуйста, проверьте второй фрагмент ответа выше.
Король-Волшебник

это сдвигает текст (заголовок), так бесполезно!
user155

4

Используйте этот подкласс, набор separatorInsetне работает для iOS 9.2.1, содержимое будет сжато.

@interface NSPZeroMarginCell : UITableViewCell

@property (nonatomic, assign) BOOL separatorHidden;

@end

@implementation NSPZeroMarginCell

- (void) layoutSubviews {
    [super layoutSubviews];

    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            if (CGRectGetHeight(view.frame) < 3) {
                view.hidden = self.separatorHidden;
            }
        }
    }
}

@end

https://gist.github.com/liruqi/9a5add4669e8d9cd3ee9


4

Гораздо проще и логичнее сделать это:

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { return [[UIView alloc] initWithFrame:CGRectZero]; }

В большинстве случаев вы не хотите видеть только последний разделитель tableCiewCell. При таком подходе удаляется только последний разделитель tableViewCell, и вам не нужно думать о проблемах с автоматическим размещением (т. Е. О вращающемся устройстве) или значениях жесткого кода для настройки вставок разделителя.


1
Добро пожаловать в стек переполнения! Лучший ответ для будущих читателей объяснил бы, почему это проще и логичнее.
CGritton

отличное решение!
geek1706


3

Используя Swift 3 и применяя самый быстрый хакерский метод, вы можете улучшить код, используя расширения :

extension UITableViewCell {

    var isSeparatorHidden: Bool {
        get {
            return self.separatorInset.right != 0
        }
        set {
            if newValue {
                self.separatorInset = UIEdgeInsetsMake(0, self.bounds.size.width, 0, 0)
            } else {
                self.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
            }
        }
    }

}

Затем, когда вы настраиваете ячейку:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "identifier", for: indexPath)
    switch indexPath.row {
       case 3:
          cell.isSeparatorHidden = true
       default:
          cell.isSeparatorHidden = false
    }
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath)
    if cell.isSeparatorHidden { 
       // do stuff
    }
}

2
  if([_data count] == 0 ){
       [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];//  [self tableView].=YES;
    } else {
      [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];////    [self tableView].hidden=NO;
    }

2

Лучший способ добиться этого - отключить разделители строк по умолчанию, UITableViewCellсоздать подкласс и добавить собственный разделитель строк в качестве подпредставления contentView- см. Ниже настраиваемую ячейку, которая используется для представления объекта типа SNStock, имеющего два строковых свойства, tickerи name:

import UIKit

private let kSNStockCellCellHeight: CGFloat = 65.0
private let kSNStockCellCellLineSeparatorHorizontalPaddingRatio: CGFloat = 0.03
private let kSNStockCellCellLineSeparatorBackgroundColorAlpha: CGFloat = 0.3
private let kSNStockCellCellLineSeparatorHeight: CGFloat = 1

class SNStockCell: UITableViewCell {

  private let primaryTextColor: UIColor
  private let secondaryTextColor: UIColor

  private let customLineSeparatorView: UIView

  var showsCustomLineSeparator: Bool {
    get {
      return !customLineSeparatorView.hidden
    }
    set(showsCustomLineSeparator) {
      customLineSeparatorView.hidden = !showsCustomLineSeparator
    }
  }

  var customLineSeparatorColor: UIColor? {
   get {
     return customLineSeparatorView.backgroundColor
   }
   set(customLineSeparatorColor) {
     customLineSeparatorView.backgroundColor = customLineSeparatorColor?.colorWithAlphaComponent(kSNStockCellCellLineSeparatorBackgroundColorAlpha)
    }
  }

  required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

  init(reuseIdentifier: String, primaryTextColor: UIColor, secondaryTextColor: UIColor) {
    self.primaryTextColor = primaryTextColor
    self.secondaryTextColor = secondaryTextColor
    self.customLineSeparatorView = UIView(frame:CGRectZero)
    super.init(style: UITableViewCellStyle.Subtitle, reuseIdentifier:reuseIdentifier)
    selectionStyle = UITableViewCellSelectionStyle.None
    backgroundColor = UIColor.clearColor()

    contentView.addSubview(customLineSeparatorView)
    customLineSeparatorView.hidden = true
  }

  override func prepareForReuse() {
    super.prepareForReuse()
    self.showsCustomLineSeparator = false
  }

  // MARK: Layout

  override func layoutSubviews() {
    super.layoutSubviews()
    layoutCustomLineSeparator()
  }

  private func layoutCustomLineSeparator() {
    let horizontalPadding: CGFloat = bounds.width * kSNStockCellCellLineSeparatorHorizontalPaddingRatio
    let lineSeparatorWidth: CGFloat = bounds.width - horizontalPadding * 2;
    customLineSeparatorView.frame = CGRectMake(horizontalPadding,
      kSNStockCellCellHeight - kSNStockCellCellLineSeparatorHeight,
      lineSeparatorWidth,
      kSNStockCellCellLineSeparatorHeight)
  }

  // MARK: Public Class API

  class func cellHeight() -> CGFloat {
    return kSNStockCellCellHeight
  }

  // MARK: Public API

  func configureWithStock(stock: SNStock) {
    textLabel!.text = stock.ticker as String
    textLabel!.textColor = primaryTextColor
    detailTextLabel!.text = stock.name as String
    detailTextLabel!.textColor = secondaryTextColor
    setNeedsLayout()
  } 
}

Чтобы отключить использование разделителя в строке по умолчанию, tableView.separatorStyle = UITableViewCellSeparatorStyle.None;. Потребительская сторона относительно проста, см. Пример ниже:

private func stockCell(tableView: UITableView, indexPath:NSIndexPath) -> UITableViewCell {
  var cell : SNStockCell? = tableView.dequeueReusableCellWithIdentifier(stockCellReuseIdentifier) as? SNStockCell
  if (cell == nil) {
    cell = SNStockCell(reuseIdentifier:stockCellReuseIdentifier, primaryTextColor:primaryTextColor, secondaryTextColor:secondaryTextColor)
  }
  cell!.configureWithStock(stockAtIndexPath(indexPath))
  cell!.showsCustomLineSeparator = true
  cell!.customLineSeparatorColor = tintColor
  return cell!
}


2

Если принятый ответ не работает, вы можете попробовать это:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 0.01f; }

Здорово ;)


1

Попробуйте приведенный ниже код, может помочь решить вашу проблему

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

   NSString* reuseIdentifier = @"Contact Cell";

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
    if (nil == cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
if (indexPath.row != 10) {//Specify the cell number
        cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithLine.png"]];

} else {
        cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithOutLine.png"]];

}

    }

    return cell;
}

1
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

       NSString *cellId = @"cell";
       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
       NSInteger lastRowIndexInSection = [tableView numberOfRowsInSection:indexPath.section] - 1;

       if (row == lastRowIndexInSection) {
              CGFloat halfWidthOfCell = cell.frame.size.width / 2;
              cell.separatorInset = UIEdgeInsetsMake(0, halfWidthOfCell, 0, halfWidthOfCell);
       }
}

1

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

- (void)awakeFromNib {
    // Initialization code
    self.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);
    //self.layoutMargins = UIEdgeInsetsZero;
    [self setBackgroundColor:[UIColor clearColor]];
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
}

Также установите поле UITableView Layout, как указано ниже

tblSignup.layoutMargins = UIEdgeInsetsZero;

1

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

- (void)layoutSubviews {
    [super layoutSubviews];
    [self hideCellSeparator];
}
// workaround
- (void)hideCellSeparator {
    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            [view removeFromSuperview];
        }
    }
}

1

Для iOS7 и выше, более чистый способ - использовать INFINITY вместо жестко заданного значения. Вам не нужно беспокоиться об обновлении ячейки при повороте экрана.

if (indexPath.row == <row number>) {
    cell.separatorInset = UIEdgeInsetsMake(0, INFINITY, 0, 0);
}

3
Имейте в виду: использование INFINITY вызывает исключение во время выполнения на iOS9
AndrewR

1

Как отмечали (многие) другие, вы можете легко скрыть все разделители UITableViewCell, просто отключив их для всего UITableView; например, в вашем UITableViewController

- (void)viewDidLoad {
    ...
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    ...
}

К сожалению, это настоящая PITA для каждой ячейки , о чем вы действительно просите.

Лично я пробовал многочисленные варианты изменения cell.separatorInset.left, опять же, как предложили (многие) другие, но проблема в том, чтобы процитировать Apple (выделение добавлено):

« ... Вы можете использовать это свойство, чтобы добавить пространство между содержимым текущей ячейки и левым и правым краями таблицы. Положительные значения вставки перемещают содержимое ячейки и разделитель ячеек внутрь и от краев таблицы ... »

Поэтому, если вы попытаетесь «спрятать» разделитель, переместив его за пределы экрана вправо, вы также можете сделать отступ в тоже самое для contentView вашей ячейки. Как предполагает Crifan, вы можете попытаться компенсировать этот неприятный побочный эффект, установив cell.indentationWidthиcell.indentationLevel соответственно переместив все обратно, но я обнаружил, что это также ненадежно (контент по-прежнему получает отступы ...).

Самый надежный способ, который я нашел, это layoutSubviewsпереопределить простой подкласс UITableViewCell и установить правую вставку так, чтобы он попадал в левую вставку, делая разделитель равным 0 ширины и таким образом невидимым [это необходимо сделать в layoutSubviews, чтобы автоматически обрабатывать повороты. Я также добавляю удобный метод в свой подкласс, чтобы включить это.

@interface MyTableViewCellSubclass()
@property BOOL separatorIsHidden;
@end

@implementation MyTableViewCellSubclass

- (void)hideSeparator
{
    _separatorIsHidden = YES;
}

- (void)layoutSubviews
{
    [super layoutSubviews];

    if (_separatorIsHidden) {
        UIEdgeInsets inset = self.separatorInset;
        inset.right = self.bounds.size.width - inset.left;
        self.separatorInset = inset;
    }
}

@end

Предостережение: не существует надежного способа восстановить исходную правую вставку, поэтому вы не можете «скрыть» разделитель, поэтому я использую необратимый hideSeparatorметод (против предоставления разделителя IsHidden). Пожалуйста, обратите внимание, что separatorInset сохраняется в повторно используемых ячейках, поэтому, поскольку вы не можете «скрыть», вам нужно держать эти ячейки скрытого разделителя изолированными в их собственном reuseIdentifier.


1

Моим требованием было скрыть разделитель между 4-й и 5-й ячейками. Я достиг этого

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if(indexPath.row == 3)
    {
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);
    }
}

1

Swift:

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    ...

    // remove separator for last cell
    cell.separatorInset = indexPath.row < numberOfRowsInSection-1
        ? tableView.separatorInset
        : UIEdgeInsets(top: 0, left: tableView.bounds.size.width, bottom: 0, right: 0)

    return cell
}

Objective-C:

- (UITableViewCell *)tableView:(UITableView *)tableView
     cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    ...

    // remove separator for last cell
    cell.separatorInset = (indexPath.row < numberOfRowsInSection-1)
        ? tableView.separatorInset
        : UIEdgeInsetsMake(0.f, tableView.bounds.size.width, 0.f, 0.f);

    return cell;
}

1

Внутри класса ячеек таблицы. поставить эти строки кода

separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: self.bounds.size.width)

Не учитывает изменения макета устройства / сцены.
Уомбл

0

На iOS9 у меня была проблема, заключающаяся в том, что смена вставок разделителя также влияет на позиционирование text- и detailLabel.

Я решил это с этим

override func layoutSubviews() {
    super.layoutSubviews()

    separatorInset = UIEdgeInsets(top: 0, left: layoutMargins.left, bottom: 0, right: width - layoutMargins.left)
}

Не работает с классом UITableViewCell - TextLabel и DetailTextLabel удаляются от ячейки.
Ник Ков
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.