Пользовательский контроль переупорядочения UITableViewCell

Есть ли способ изменить изображение элемента управления переупорядочением, которое отображается, когда UITableView находится в режиме редактирования? У меня есть UIImage, который Id должен отображать вместо обычных серых полосок.

Нужно ли мне подклассифицировать UITableViewCell для выполнения этого?

Ответ 1

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

Я предполагаю, что это как-то связано со следующим комментарием в документах UITableviewCell: showsReorderControl:

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

Другими словами, editAccessoryView заменяется представлением элемента управления переупорядочением, что может быть причиной того, что мы не можем переопределить элемент управления переупорядочением. Надеясь, что кто-то может найти обходной путь.

Ответ 3

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

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

В ходе различных версий iOS иерархия представлений в UITableViewCell изменилась. Я выбрал подход, который будет проходить через весь набор представлений, пока не найдет закрытый класс UITableViewCellReorderControl. Я полагаю, что это будет работать для iOS 5 и всех последующих версий iOS во время этого ответа. Обратите внимание, что хотя сам класс UITableViewCellReorderControl является частным, я не использую какой-либо закрытый API для его поиска.

Во-первых, здесь код для сканирования элемента управления переупорядочением; Я предполагаю, что текст "Изменить порядок" будет в названии класса - что Apple может изменить в будущем:

-(UIView *) findReorderView:(UIView *) view
{
    UIView *reorderView = nil;
    for (UIView *subview in view.subviews)
    {
        if ([[[subview class] description] rangeOfString:@"Reorder"].location != NSNotFound)
        {
            reorderView = subview;
            break;
        }
        else
        {
            reorderView = [self findReorderView:subview];
            if (reorderView != nil)
            {
                break;
            }
        }
    }
    return reorderView;
}

В своем пользовательском подклассе UITableViewCell вы переопределите -(void) setEditing:animated: и найдете здесь элемент управления переупорядочением. Если вы попытаетесь найти этот элемент управления, когда таблица не находится в режиме редактирования, элемент управления переупорядочением не будет находиться в иерархии представлений для ячейки:

-(void) setEditing:(BOOL)editing animated:(BOOL)animated
{
    [super setEditing:editing animated:animated];
    if (editing)
    {
        // find the reorder view here
        // place the previous method either directly in your
        // subclassed UITableViewCell, or in a category
        // defined on UIView
        UIView *reorderView = [self findReorderView:self];
        if (reorderView)
        {
            // here, I am changing the background color to match my custom cell
            // you may not want or need to do this
            reorderView.backgroundColor = self.contentView.backgroundColor;
            // now scan the reorder control subviews for the reorder image
            for (UIView *sv in reorderView.subviews)
            {
                if ([sv isKindOfClass:[UIImageView class]])
                {
                    // and replace the image with one that you want
                    ((UIImageView *)sv).image = [UIImage imageNamed:@"yourImage.png"];
                    // it may be necessary to properly size the image frame
                    // for your new image - in my experience, this was necessary
                    // the upper left position of the UIImageView frame
                    // does not seem to matter - the parent reorder control
                    // will center it properly for you
                    sv.frame = CGRectMake(0, 0, 48.0, 48.0);
                }
            }
        }
    }
}

Ваш пробег может отличаться; Я надеюсь, что это работает для вас.

Ответ 4

Вы устанавливаете свойство ячейки editingAccessoryView в представление изображения, содержащее требуемое изображение.

В стороне, я бы предостерег вас, чтобы быть осторожным при этом. Когда вы заменяете пользовательскую графику для системного стандарта, например графику переупорядочения, вы рискуете запутать пользователя. Стандартная грамматика пользовательского интерфейса предложила им ожидать стандартной графики при переупорядочении, и они могут не понимать значимости вашей пользовательской графики.

Ответ 5

Может, мы все это задумаемся.:)

Просто поместите пользовательский UIImageView поверх верхней аксессуара для перемещения по умолчанию, чтобы он ее закрыл. Готово.