Скрыть разделительную линию на одном UITableViewCell - PullRequest
221 голосов
/ 19 декабря 2011

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

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

Ответы [ 38 ]

1 голос
/ 19 декабря 2011

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

- (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 голос
/ 14 июня 2015

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

- (void)layoutSubviews {
    [super layoutSubviews];
    [self hideCellSeparator];
}
// workaround
- (void)hideCellSeparator {
    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            [view removeFromSuperview];
        }
    }
}
1 голос
/ 10 августа 2016

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

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

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

Лично я пробовал многочисленные варианты изменения 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

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

1 голос
/ 05 марта 2015

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

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

Также установите отступ для макета UITableView следующим образом

tblSignup.layoutMargins = UIEdgeInsetsZero;
1 голос
/ 25 июля 2015

Для Swift 2:

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

tableView.separatorColor = UIColor.clearColor()
1 голос
/ 29 июля 2015

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

if (indexPath.row == <row number>) {
    cell.separatorInset = UIEdgeInsetsMake(0, INFINITY, 0, 0);
}
1 голос
/ 12 января 2016

Моим требованием было скрыть разделитель между 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 голос
/ 11 февраля 2017
cell.separatorInset = UIEdgeInsetsMake(0.0, cell.bounds.size.width, 0.0, -cell.bounds.size.width)

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

enter image description here

1 голос
/ 30 октября 2018

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

if you cant find the Seperator, Click here

1 голос
/ 13 декабря 2014
- (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);
       }
}
...