Recientemente me encontré con la necesidad de cambiar la imagen para el control de reordenación, porque subclases UITableViewCell
para proporcionar mi propia celda de la tabla personalizada. Como parte de este esfuerzo, cambié el fondo de la celda a algo que no sea el color predeterminado.
Todo funciona correctamente, pero cuando coloque el UITableView
en modo de edición, aparecerá el control de reordenar, con un fondo blanco, en lugar del color de fondo que estaba usando para la celda. Esto no se veía bien, y quería que el fondo coincidiera.
Durante el transcurso de varias versiones de iOS, la jerarquía de vistas en un UITableViewCell
ha cambiado. Tomé un enfoque que atravesará todo el conjunto de vistas hasta que encuentre la clase privada UITableViewCellReorderControl
. Creo que esto funcionará para iOS 5 y todas las versiones posteriores de iOS en el momento de esta respuesta. Tenga en cuenta que aunque la clase UITableViewCellReorderControl
es privada, no estoy usando ninguna API privada para encontrarla.
Primero, aquí está el código para buscar el control de reorden; Estoy asumiendo que el texto "Reordenar" estará en el nombre de la clase - la que Apple podría cambiar en el futuro:
-(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;
}
en su aduana UITableViewCell subclase, se anulará -(void) setEditing:animated:
y encontrar el control de reordenación aquí.Si se intenta encontrar este control cuando la tabla no está en modo de edición, el control de reordenación no estará en la jerarquía de vistas de la célula:
-(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);
}
}
}
}
}
Su experiencia puede variar; Espero que esto funcione para ti.
No es tan diferente de la vista predeterminada; las líneas son onduladas en lugar de rectas ... –
¿Dónde debo hacer esto? Si lo hago al instanciar la celda, lo único que obtengo es una vista adicional a la izquierda de la vista de reordenar predeterminada. Tampoco puedo reordenar las celdas al arrastrar la nueva imagen. Intenté configurar 'cell.editingAccessoryType = UITableViewCellEditingStyleNone;' pero fue en vano. –
Los documentos dicen que se debe usar 'UITableViewCellAccessoryDetailDisclosureButton' o que la vista de accesorio de edición nunca aparece o no responde. Lea los documentos de UITableView para más detalles. – TechZen