Подтвердить что ты не робот

Запретить отступы UITableViewCell (contentView) во время редактирования

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

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

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

EDIT: Я имею дело с UITableView в обычном и не сгруппированном стиле.

4b9b3361

Ответ 1

К счастью, 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.

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

Ответ 2

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

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

    return NO;
}

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

cell.shouldIndentWhileEditing = NO;

Ответ 3

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

На раскадровке свойство indent While Editing по умолчанию равно checked. Его можно отключить вручную. Он равен cell.shouldIndentWhileEditing = NO.

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

Ответ 4

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

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

Ответ 5

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

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

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

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

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

    return YES;    
}

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

Ответ 6

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

Ответ 7

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

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

[<viewInCell> setAutoresizingMask:UIViewAutoresizingNone];

Или отключить Автосоставление ширины и/или высоты непосредственно в Interface Builder.

Ответ 8

Просто натолкнулся на это, поскольку я изучал ту же проблему.

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

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

Ответ 9

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

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