it-swarm.com.ru

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

Я настраиваю UITableView. Я хочу скрыть разделительную строку в last cell ... Могу ли я это сделать?

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

204
Safari

в 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);
}
326
Hiren

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

Свифт:

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);
}
209
Avinash

Чтобы проконтролировать ответ Hiren.

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

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

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

Interface builder

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

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

enter image description here

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

Правка: Для тех, кто не всегда читает комментарии, на самом деле есть лучший способ сделать это с помощью нескольких строк кода: 

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

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

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

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

50
Kemenaran

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

  • 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

и эффект:  enter image description here

29
crifan

Лучшее решение для 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.

8
Sound Blaster

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

extension UITableViewCell {

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

  func showSeparator() {
    self.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
  }
}

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

cell.hideSeparator()
cell.showSeparator()

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

8
pandaren codemaster

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

enter image description here

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

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

Однако это не похоже на работу для меня. Я не уверен почему. Поэтому я решил использовать Hiren's answer , но с использованием 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
Enrico Susatyo

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

override func layoutSubviews() {
    super.layoutSubviews()

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

Используйте этот подкласс, установите 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
liruqi

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

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
Greg Price

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

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

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

4
rostislawk

В 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)
    }
}
4
King-Wizard

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

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
    }
}
3
Luca Davanzo

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

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

Это великолепно ;)

2
debiasej

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;
}
2
RyuX51

В willdisplaycell:

cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
2
Kimate Richards
  if([_data count] == 0 ){
       [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];//  [self tableView].=YES;
    } else {
      [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];////    [self tableView].hidden=NO;
    }
2
Gank

Для Swift 2:

добавьте следующую строку в viewDidLoad():

tableView.separatorColor = UIColor.clearColor()
1
Sebastian
- (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
Adobels

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

- (void)layoutSubviews {
    [super layoutSubviews];
    [self hideCellSeparator];
}
// workaround
- (void)hideCellSeparator {
    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            [view removeFromSuperview];
        }
    }
}
1
Mahmoud Adam
cell.separatorInset = UIEdgeInsetsMake(0.0, cell.bounds.size.width, 0.0, -cell.bounds.size.width)

хорошо работает в iOS 10.2

 enter image description here

1
katwal-Dipak

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

- (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
Coder_A_D

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

- (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
Nakkeeran

Моим требованием было скрыть разделитель между 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
SMS

Лучший способ добиться этого - отключить разделители строк по умолчанию, подкласс 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!
}
1
Zorayr

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

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

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

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

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

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

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

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

Самый надежный способ, который я нашел, это переопределить layoutSubviews в простом подклассе UITableViewCell и установить встраивание right так, чтобы он попадал в левый, делая разделитель шириной 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

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

0
tiritea

Это работает для меня, когда я использую расширение и вызываю в layoutSubviews () для немедленного обновления представлений макета.

extension UITableViewCell {

    func removeSeparator() {
        separatorInset = UIEdgeInsetsMake(0, bounds.size.width, 0, 0)
    }
}

override func layoutSubviews() {
    super.layoutSubviews()

    removeSeparator()
}
0
Top

Код, который имеют все ответы, сделает заполнение ячеек равным нулю вместо значения по умолчанию. Я видел проблему в iOS 11 iPad Pro 12 ''

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

Вот код, который я использовал:

typedef enum PXSettingsTableSections {
    PXSettingSectionInvite = 0,
    PXSettingSectionAccount,
    PXSettingSectionPrivacy,
    PXSettingSectionCreation,
    PXSettingSectionTest,
    PXSettingSectionAboutHide,  // invisble section just to hide separator Line
    PXSettingSectionFooterHide, // invisble section just to hide separator Line
    PXSettingSectionNumItems,
} PXSettingsTableSectionsType;


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return PXSettingSectionNumItems;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    switch (section) {
        case PXSettingSectionInvite: return 1;
        case PXSettingSectionAccount:return (isSocialLogin) ? 1 : 2;
        case PXSettingSectionPrivacy: return 1;
        case PXSettingSectionCreation: return 2;
        case PXSettingSectionTest: return 3;
        case PXSettingSectionAboutHide: return 3;
        default: return 0;
    }
}


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    switch(section)
    {
        case PXSettingSectionInvite: return nil;
        case PXSettingSectionAccount: return @"Account";
        case PXSettingSectionPrivacy: return @"Privacy";
        case PXSettingSectionCreation: return @"Someting";
        case PXSettingSectionTest: return @"Test";
        case PXSettingSectionAboutHide: return @" ";
        case PXSettingSectionFooterHide: return @" ";
    }
    return nil;
}


- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {

    UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;
    if (section == PXSettingSectionFooterHide || section == PXSettingSectionAboutHide) {
        // [UIColor clearColor] will not work 
        [header.contentView setBackgroundColor:[UIColor whiteColor]];
    }
}


- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    // You can control here the size of one specific section
    if(section == PXSettingSectionAboutHide){
        return 0.0000001; //make it real small
    }
    return 45.0;
}


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

    switch(indexPath.section)
    {
        case PXSettingSectionInvite:
            return self.inviteCell;
        case PXSettingSectionAccount:
            if (isSocialLogin) {
                return self.myWalletCell;
            }
            switch(indexPath.row)
            {
                case 0: return self.changePasswordCell;
                case 1: return self.myWalletCell;
            }
        case PXSettingSectionPrivacy:
            switch(indexPath.row)
        {
            case 0: return self.privateAccountCell;
        }
        case PXSettingSectionCreation:
            switch(indexPath.row)
        {
            case 0: return self.videoResolutionCell;
            case 1: return self.selfieMirrorCell;
        }
        case PXSettingSectionTest:
            switch(indexPath.row)
        {
            case 0: return self.termsOfUseImageCell;
            case 1: return self.attributionCell;
            case 2: return self.aboutCell;
        }
        case PXSettingSectionAboutHide:{
            switch(indexPath.row)
            {
                case 0: return self.clearCacheCell;
                case 1: return self.feedbackCell;
                case 2: return self.logoutCell;
            }
        }
    }

    return self.emptyCell;
}
0
Tiago Mendes

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

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

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

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

override func layoutSubviews() {
    super.layoutSubviews()

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

Установите separatorInset.right = .greatestFiniteMagnitude в своей ячейке.

0
Matthew Korporaal

Если вы используете StoryBoard, вы можете просто выбрать TableView и в «Seperator» изменить его на «none»

 if you cant find the Seperator, Click here

0
Tommy