Предотвратить отступ UITableViewCell (contentView) при редактировании - PullRequest
33 голосов
/ 26 апреля 2011

Можно ли сохранить contentView.frame всегда одинаковым, независимо от tableView.editing? Я уже пытался переопределить layoutSubviews и willTransitionToState, но эти опции тоже потерпели неудачу. Я не могу изменить ширину contentView. Или, может быть, мой подход просто невозможен ... Может быть, есть другой способ решить эту проблему.

Я хочу добиться следующего поведения: я хочу, чтобы стандарт textLabel для UITableViewCell был всегда с отступом и не менял положение, когда tableView входит в режим редактирования. Вероятно, проблема, с которой я столкнусь, заключается в том, что поведение detailTextLabel необходимо будет исправить (например, усечение текста, если содержание textLabel слишком длинное). Причина, по которой я не хочу реализовывать свой собственный UILabel, заключается в том, что пользовательские подпредставления значительно снизят производительность прокрутки.

Я надеюсь, что кто-то уже реализовал что-то подобное в своих UITableView и сможет показать мне решение этой утомительной проблемы. Заранее спасибо!

РЕДАКТИРОВАТЬ: Я имею дело с UITableView в простом и не сгруппированном стиле.

Ответы [ 9 ]

100 голосов
/ 26 апреля 2011

Используйте метод UITableViewDelegate:

- (BOOL)tableView:(UITableView *)tableView 
        shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{

    return NO;
}

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

cell.shouldIndentWhileEditing = NO;
10 голосов
/ 20 января 2012

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

Этот (некрасивый) фрагмент кода будет удерживать фрейм с фиксированным значением, равным origin.x==0.Это легко адаптируется к вашим конкретным потребностям.

// put this in your UITableViewCell subclass
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"observed value for kp %@ changed: %@",keyPath,change);
    if ( [keyPath isEqual:@"frame"] && object == self.contentView )
    {
        CGRect newFrame = self.contentView.frame;
        CGRect oldFrame = [[change objectForKey:NSKeyValueChangeOldKey] CGRectValue];
        NSLog(@"frame old: %@  new: %@",NSStringFromCGRect(oldFrame),NSStringFromCGRect(newFrame));

        if ( newFrame.origin.x != 0 ) self.contentView.frame = oldFrame;
    }
}

// add the cell as an observer for frame changes, somewhere in initialization:
[self.contentView addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionOld context:nil];

// IMPORTANT: remove the cell as an observer in -dealloc:
[self.contentView removeObserver:self forKeyPath:@"frame"];

Это позволит только рамке изменить значения на origin.x==0.Удалите строки NSLog() для сборок Release.

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

8 голосов
/ 24 мая 2016

На основе Usman.3D

В раскадровке свойство indent While Editing по умолчанию имеет значение checked.Это можно снять вручную.Это равно cell.shouldIndentWhileEditing = NO.

enter image description here

2 голосов
/ 05 октября 2011

У меня была такая же проблема с моей таблицей простых стилей, даже когда shouldIndentWhileEditingRowAtIndexPath возвращает NO

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

Я добавил этот второй метод, и он работал:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {

    if (indexPath.row == 0 && indexPath.section == 0) return NO;

    return YES;    
}

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

2 голосов
/ 26 апреля 2011

Для этого вам придется переопределить layoutSubviews.Это относится к уровню пользовательских отступов, поэтому оно не применяется ни к чему.

Пожалуйста, посмотрите на Как я могу изменить размер отступа на моем пользовательском UITableViewCell при редактировании? .Я привел пример, как изменить уровень отступа.Хотя он не работал на 100% для OP, он работал в моем примере приложения.Я думаю, что это укажет вам правильное направление.

0 голосов
/ 26 ноября 2015

Вы всегда можете получить ячейку просмотра таблицы с указателем.Используя этот повторный идентификатор ячейки tableview, вы можете избежать изменения размера содержимого ячейки tableview или нет.У меня было требование реализовать подобный вид функциональности, чтобы избежать изменения размеров отдельных ячеек.ПФБ код.

-(BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath{

BOOL shouldIndentWhileEditingRow = NO;

UITableViewCell *lTableViewCell = [tableView cellForRowAtIndexPath:indexPath];

/*Change the position of the target rect based on Sending messages or Receiving messages*/
if ([lTableViewCell.reuseIdentifier isEqualToString:@"SendingChatCellIdentifier"]) {

    shouldIndentWhileEditingRow = NO;

}else if ([lTableViewCell.reuseIdentifier isEqualToString:@"ReceivingChatCellIdentifier"]){

    shouldIndentWhileEditingRow = YES;
}

return shouldIndentWhileEditingRow;
}
0 голосов
/ 28 декабря 2012

Просто столкнулся с этим, когда я исследовал ту же проблему.

Очень простое решение - установить уровень отступа в отрицательное число - это целое число со знаком.

[cell setIndentationLevel: -3] отлично работал для меня, учитывая ширину отступа по умолчанию, равную 10, для перемещения метки назад влево в простой таблице.

0 голосов
/ 27 декабря 2012

Немного поздно,

, но я решил проблему, отключив маску автоматического изменения размера для всех представлений в моей TableViewCell:

[<viewInCell> setAutoresizingMask:UIViewAutoresizingNone];

Или отключил автоматическое изменение размера по ширине и / или высотенепосредственно в Интерфейсном Разработчике.

0 голосов
/ 26 апреля 2011

Вы смотрели UITableViewCell shouldIndentWhileEditing и indentationLevel свойства?Те могут сортировать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...