Недавно я столкнулся с необходимостью изменить изображение для элемента управления переупорядочением, поскольку я подклассифицировал 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);
}
}
}
}
}
Ваш пробег может отличаться;Я надеюсь, что это работает для вас.