Содержимое 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
    }
}