Запретить отступы UITableViewCell (contentView) во время редактирования
Можно ли сохранить contentView.frame
всегда одинаково, независимо от tableView.editing
? Я уже пытался переопределить layoutSubviews
и willTransitionToState
, но эти параметры тоже вышли из строя. Кажется, я не могу изменить ширину contentView. Или, может быть, мой подход просто невозможно...
Возможно, есть еще один способ решить эту проблему.
Поведение, которое я хочу достичь, следующее: я хочу, чтобы стандартный textLabel
UITableViewCell
был всегда с отступом и не менял позицию, когда tableView переходит в режим редактирования. Проблема, с которой я, вероятно, столкнусь, заключается в том, что поведение detailTextLabel
должно быть исправлено (например, усечение текста, если текст textLabel
слишком длинный). Причина, по которой я не хочу реализовывать свой собственный UILabel
, заключается в том, что пользовательские подпункты уменьшат производительность прокрутки на значительную сумму.
Я надеюсь, что кто-то уже реализовал что-то подобное в своем UITableView
и мог показать мне решение этой утомительной проблемы. Спасибо заранее!
EDIT: Я имею дело с UITableView
в обычном и не сгруппированном стиле.
Ответы
Ответ 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;
}