Содержимое UITableViewCell перекрывает кнопку удаления в режиме редактирования в iOS7
Я создаю UITableView
с пользовательскими UITableViewCell
s. Новая кнопка удаления iOS 7 вызывает некоторые проблемы с компоновкой моей ячейки.
Если я использую кнопку "Изменить", из-за которой появляются красные круги, я получаю проблему, но если я провёл одну ячейку, она выглядит идеально.
Это когда используется кнопка "Редактировать":
[self.tableView setEditing:!self.tableView.editing animated:YES];
![Content overlaps the delete button]()
Это когда я прокручиваю одну ячейку:
![Content is placed right]()
Как вы можете, мои ярлыки перекрывают кнопку удаления в первом примере. Почему он это делает и как я могу его исправить?
Ответы
Ответ 1
попробуйте использовать accessoryView
и editingAccessoryView
свойства вашего UITableViewCell
, вместо того, чтобы добавлять представление самостоятельно.
Если вы хотите, чтобы один и тот же индикатор отображался как в режиме редактирования, так и в режиме без редактирования, попробуйте настроить оба свойства вида на один и тот же вид в вашем UITableViewCell
, например:
self.accessoryView = self.imgPushEnabled;
self.editingAccessoryView = self.imgPushEnabled;
Кажется, что сбой в анимации редактирования таблицы в IOS7, что дает перекрытие кнопки удаления и accessoryView
при переходе в состояние без редактирования. Это происходит, когда указан accesoryView
, а editingAccessoryView
- nil
.
Обходной путь для этого сбоя, по-видимому, указывает на невидимое редактирование вида доступа:
self.editingAccessoryView =[[UIView alloc] init];
self.editingAccessoryView.backgroundColor = [UIColor clearColor];
Ответ 2
Я решил эту проблему с установкой ограничений без ширины только ведущих и конечных
Ответ 3
Проблема заключается в том, что в режиме редактирования содержимое cellView изменяется в размере. Поэтому либо вы должны переопределить layoutSubviews
в своей ячейке и поддерживать разные размеры кадров
- (void) layoutSubviews
{
[super layoutSubviews];
CGRect contentFrame = self.contentView.frame;
// adjust to the contentView frame
...
}
или вы берете приманку и переключаетесь на автозапуск.
Сначала я думал, что установка contentView.clipsToBounds
в YES
может быть уродливым обходным решением, но это, похоже, не работает.
Ответ 4
Как уже упоминалось, вы можете переключиться на автозапуск, чтобы решить эту проблему. Но если вы (понятно) не хотите связываться с автозапуском только для этого одного экземпляра, вы можете установить autoresizingMask и автоматически преобразовать его в соответствующие ограничения автоопределения.
label.autoresizingMask = UIViewAutoresizingFlexibleWidth;
Ответ 5
Просто используйте этот метод в своем классе TableViewCell, вы можете получить идеальный ответ,
Здесь self
есть UITableviewCell
- (void)layoutSubviews {
[super layoutSubviews];
for (UIView *subview in self.subviews) {
for (UIView *subview2 in subview.subviews) {
if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { // move delete confirmation view
[subview bringSubviewToFront:subview2];
}
}
}
}
Ответ 6
И если кто-то хочет отрегулировать размер кнопки "Удалить", используйте следующий код
- (void)layoutSubviews {
[super layoutSubviews];
for (UIView *subview in self.subviews) {
for (UIView *subview2 in subview.subviews) {
if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { // move delete confirmation view
CGRect rect = subview2.frame;
rect.size.height = 47; //adjusting the view height
subview2.frame = rect;
for (UIButton *btn in [subview2 subviews]) {
if ([NSStringFromClass([btn class]) isEqualToString:@"UITableViewCellDeleteConfirmationButton"]) { // adjusting the Button height
rect = btn.frame;
rect.size.height = CGRectGetHeight(subview2.frame);
btn.frame = rect;
break;
}
}
[subview bringSubviewToFront:subview2];
}
}
}
}
Ответ 7
Лучший способ удалить эту проблему - добавить изображение в ячейку и установить его в Backside.
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bgImg.png"]];
imageView.frame = CGRectMake(0, 0, 320, yourCustomCell.frame.size.height);
[yourCustomCell addSubview:imageView];
[yourCustomCell sendSubviewToBack:imageView];
Если ваш текст будет перекрывать кнопку удаления, тогда реализуйте Autolayout. Он справится с этим лучше.
Еще один случай может быть сгенерирован, что cellSelectionStyle выделяет цвет по умолчанию. Вы можете установить цвет подсветки следующим образом
yourCustomCell.selectionStyle = UITableViewCellSelectionStyleNone;
Установите стиль выбора ячейки таблицы в UITableViewCellSelectionStyleNone. Это приведет к удалению синего фона или другого. Затем, чтобы сделать текстовую метку или подсветку содержимого, как вы хотите, используйте этот метод в классе yourCustomCell.m.
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
if (highlighted)
self.contentView.backgroundColor = [UIColor greenColor];
else
self.contentView.backgroundColor = [UIColor clearColor];
}
Надеюсь, вы лучше поймете это.
Ответ 8
Приведение в начало UITableViewCellDeleteConfirmationView
в layoutSubviews
настраиваемой ячейки работает для меня на iPhone, но не на iPad.
У меня есть UITableView
в главной части splitViewController
для iPad, и в этом случае
кадр UITableViewCellDeleteConfirmationView
равен (768 0; 89 44) вместо (320 0; 89 44)
Итак, я изменяю размер кадра в методе layoutSubviews
, и это работает для меня
- (void)layoutSubviews {
[super layoutSubviews];
for (UIView *subview in self.subviews)
{
for (UIView *subview2 in subview.subviews)
{
if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"])
{
CGRect frame = subview2.frame;
frame.origin.x = 320;
subview2.frame = frame;
[subview bringSubviewToFront:subview2];
}
}
}
}
Ответ 9
Если вы размещаете контент в contentView UITableViewCell, убедитесь, что используете self.contentView.frame.size.width
, а не self.frame.size.width
в layoutSubviews.
self.frame
расширяет ширину в режиме редактирования и приведет к тому, что любой контент в праве будет проходить за пределы contentView. self.contentView.frame
остается на правильной ширине (и это то, что вы должны использовать).
Ответ 10
Попробуйте следующее: возможно, вы устанавливаете ячейку setBackgroundImage в cellForRowAtIndexPath (метод делегата). Не устанавливайте это здесь. Установите изображение в:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { cell.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"cellList.png"]]; }
Наслаждайтесь кодированием.
Ответ 11
Мое решение - перемещать весь контент влево, когда кнопка "Удалить" показывает:
override func layoutSubviews() {
super.layoutSubviews()
if editingStyle == UITableViewCellEditingStyle.Delete {
var rect = contentView.frame
rect.origin.x = self.showingDeleteConfirmation ? -15 : 38
contentView.frame = rect
}
}