Я недавно натыкался на необходимость изменения образа для управления переупорядочиванием, потому что я подклассами UITableViewCell
, чтобы обеспечить свою собственную пользовательскую ячейку таблицы. В рамках этой работы я изменил фон ячейки на нечто иное, чем цвет по умолчанию.
Все работает правильно, но когда я поместил UITableView
в режим редактирования, появится элемент управления переупорядочением с белым фоном - вместо цвета фона, который я использовал для ячейки. Это выглядело не очень хорошо, и я хотел, чтобы фон соответствовал.
В ходе различных версий iOS изменилась иерархия представлений в UITableViewCell
. Я применил подход, который пересечет весь набор представлений, пока не найдет частный класс UITableViewCellReorderControl
. Я считаю, что это будет работать для iOS 5 и всех последующих версий iOS во время этого ответа. Обратите внимание, что хотя сам класс UITableViewCellReorderControl
является закрытым, я не использую какие-либо частные API, чтобы его найти.
Во-первых, вот код для проверки контроля порядка; Я предполагаю, что текст «Reorder» будет имя класса - который компания 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);
}
}
}
}
}
Ваш пробег может варьироваться; Надеюсь, это сработает для вас.
Это не то, что отличается от представления по умолчанию; линии являются волнистыми, а не прямыми ... –
Где я должен это делать? Если я делаю это, когда инициирует ячейку, единственное, что я получаю, - это дополнительный вид слева от представления по умолчанию для переупорядочения. Я также не могу изменить порядок ячеек при перетаскивании нового изображения. Я пробовал установку «cell.editingAccessoryType = UITableViewCellEditingStyleNone;», но безрезультатно. –
Документы говорят, что использовать 'UITableViewCellAccessoryDetailDisclosureButton' или вид аксессуаров для редактирования никогда не появляется или не отвечает. Подробнее читайте в документах UITableView. – TechZen