Сховати розділову лінію на одному 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 doc: "Ви можете використовувати цю властивість, щоб додати простір між вмістом поточної комірки та лівим і правим краями таблиці. Позитивні значення вставки переміщують вміст комірки та роздільник клітинок всередину та в сторону від країв таблиці."
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)

за замовчуванням маржа:

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

показувати роздільник кінцевим до кінця

cell.separatorInset = .zero

Завдання-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, роздільна лінія виводиться від лівої межі до лівого поля (якщо у вас є).
Олександр ОС

3
Це натискає на будь textLabel-який екран.
аельке

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

Ось приклад результату, коли я відображаю перегляд таблиці з динамічними клітинками (але маю лише одну із вмістом). В результаті виходить, що лише у цього є роздільник, а не всі "манекени" таблиці перегляду автоматично додаються для заповнення екрана.

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

Сподіваюсь, це допомагає.

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

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

Якщо ви використовуєте ширину меж комірки для вставки, можливо, вам доведеться перерахувати, коли інтерфейс обертається.
AndrewR

Зауважте, що якщо комірка, яку ви зробите це, буде повторно використана, щоб намалювати іншу комірку, за якою ви не збиралися приховувати сепаратор, роздільник також піде з неї.
Майкл Петерсон

1
UIEdgeInsetsMake (0, 10000, 0, 0); працював -> UIEdgeInsetsMake (0, 0, 0, cell.bounds.size.width); не. гадаю, це причина, що я маю неприємну звичку зберігати Vcs розміром 3,5 "у xibs та панелях стилів, у яких артефакти на 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. Приємно.
Womble

Налаштування правильного роздільника працювало для мене, коли я встановлюю його в 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. Чи є у вас рішення для згрупованої справи?
zslavman

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] межі] .size.width, [[UIScreen mainScreen] межі] .size.height); щоб переконатися, що його завжди не було
Даніель Галаско,

7

В iOS 7 розділений елемент клітинки стилю UITableView виглядає дещо інакше. Це виглядає приблизно так:

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

Я спробував відповісти Кеменарану :

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

Однак це, здається, не працює для мене. Я не впевнений, чому. Тому я вирішив використовувати Hiren в відповідь , але з використанням 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 перекрийте макетSubviews і прихойте _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);
}

Не має значення, у якому методі перегляду настільних таблиць ви це робите для динамічних комірок, у комірці, на яку ви змінили властивість вставки, завжди буде встановлено властивість вставки кожного разу, коли вона буде відключена, викликаючи скала відсутніх розділових рядків рядків ... Це поки ви поміняйте його самі.

Щось подібне працювало для мене:

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 за допомогою динамічних комірок. Єдина проблема, з якою ви можете зіткнутися, - це коли ви використовуєте статичні комірки з категоріями, роздільним типом, відмінним від жодного, та згрупованим стилем для подання таблиці. Насправді в цьому конкретному випадку він не приховуватиме останню клітинку кожної категорії. Щоб подолати це, рішення, яке я знайшов, полягав у тому, щоб встановити роздільник клітин (через ІБ) ні на одному, а потім створити та додати вручну (через код) свій вид лінії до кожної комірки. Для прикладу перевірте фрагмент нижче:

/*
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 за допомогою динамічних комірок. Єдина проблема, з якою ви можете зіткнутися, - це коли ви використовуєте статичні комірки з категоріями, роздільним типом, відмінним від жодного, та згрупованим стилем для подання таблиці. Насправді в цьому конкретному випадку він не приховуватиме останню клітинку кожної категорії. Щоб подолати це, рішення, яке я знайшов, полягав у тому, щоб встановити роздільник клітин (через ІБ) ні на одному, а потім створити та додати вручну (через код) свій вид лінії до кожної комірки. Для прикладу перевірте другий фрагмент відповіді вище.
Король-Чарівник

вона зміщує текст (заголовок), так марно!
користувач155

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;
    ...
}

На жаль, це справжнє ПДФА, яке потрібно робити на клітку , про що ви справді просите.

Особисто я спробував численні перестановки щодо зміни cell.separatorInset.left, знову ж таки, як (багато) інших запропонували, але проблема полягає в тому, щоб процитувати Apple (наголос додано):

" ... Ви можете використовувати цю властивість, щоб додати простір між вмістом поточної комірки та лівим і правим краями таблиці. Позитивні значення вставки переміщують вміст комірки та роздільник комірок всередину та в сторону від країв таблиці ... "

Тож якщо ви спробуєте "сховати" роздільник, підсунувши його поза екраном праворуч, ви також можете вступити відступ вмісту вашої клітини також. За пропозицією 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

Caveat: не існує надійного способу відновлення початкового правильного вставки, тому ви не можете "приховати" роздільник, тому я використовую незворотний hideSeparatorметод (проти викриття separatorIsHidden). Зверніть увагу, що separatorInset зберігається в повторно використаних клітинках, тому, оскільки ви не можете "зняти приховування", вам потрібно тримати ці приховані сепараторні осередки в їх власному повторному ідентифікаторі повторного використання.


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

Швидкий:

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
}

Завдання-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)

Не враховує зміни компонування пристрою / сцени.
Womble

0

У iOS9 у мене виникла проблема, що зміна вставки роздільника також впливає на позиціонування текстової та детальної мітки.

Я вирішив це з цим

override func layoutSubviews() {
    super.layoutSubviews()

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

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