UITableViewCell пользовательский элемент управления переупорядочением - PullRequest
12 голосов
/ 23 августа 2010

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

Нужно ли создавать подкласс UITableViewCell для этого?

Ответы [ 5 ]

9 голосов
/ 22 декабря 2011

Полагаю, вы уже давно прошли этот путь, но это вызвало новый вопрос.

Смотрите мой ответ здесь:

Изменить значок по умолчаниюперемещение ячеек в UITableView

4 голосов
/ 06 сентября 2014

Недавно я столкнулся с необходимостью изменить изображение для элемента управления переупорядочением, поскольку я подклассифицировал 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's 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's frame
                    // for your new image - in my experience, this was necessary
                    // the upper left position of the UIImageView's 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);
                }
            }
        }
    }
}

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

1 голос
/ 29 августа 2010

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

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

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

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

0 голосов
/ 11 апреля 2015

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

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

0 голосов
/ 23 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...