2010-08-23 16 views
10

¿Hay alguna manera de cambiar la imagen del control de reorden que se muestra cuando el UITableView está en modo de edición? Tengo un UIImage que me gustaría mostrar en lugar de las barras grises habituales.UITableViewCell control de reorden personalizado

¿Debo hacer una subestación de UITableViewCell para lograr esto?

Respuesta

1

Puse un poco de trabajo en esto recientemente, pero me quedé corto. Traté de configurar mi propia edición de edición de Accesory, pero no pude obtener el control de reorden para cambiar. Impar.

Mi conjetura es que tiene algo que ver con el siguiente comentario en la documentación UITableViewCell re: showsReorderControl:

Si el valor es SÍ, el control de reordenamiento reemplaza temporalmente cualquier vista accesorio.

En otras palabras, editingAccessoryView está siendo reemplazado por la vista de control de reordenamiento, que podría ser el motivo por el cual no podemos anular el control de reordenación. Esperando que alguien pueda encontrar una solución.

0

Establece la propiedad editingAccessoryView de la celda en una vista de imagen que contiene la imagen que desea.

Como nota aparte, le advierto que tenga cuidado al hacer esto. Cuando sustituye un gráfico personalizado por un estándar del sistema, como el gráfico de reorden, corre un grave riesgo de confundir al usuario. La gramática estándar de la interfaz de usuario les ha dicho que esperen el gráfico estándar al reordenar y es posible que no comprendan el significado de su gráfico personalizado.

+0

No es tan diferente de la vista predeterminada; las líneas son onduladas en lugar de rectas ... –

+0

¿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. –

+0

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

9

Supongo que ya ha superado esto, pero esto ha surgido en una nueva pregunta.

Véase mi respuesta aquí:

Change default icon for moving cells in UITableView

+0

Gracias. ¡Es genial mantener vivas las viejas preguntas a medida que surgen nuevas soluciones, en caso de que alguien busque este problema! –

+0

@RaphaelSchweikert, eso es exactamente lo que me acaba de pasar. – mattsson

+0

Esta pregunta continúa siendo útil AÑOS después de su publicación. Buen trabajo. – Unome

3

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.

0

Tal vez estamos pensando demasiado en esto. :)

Simplemente ponga un UIImageView personalizado sobre el accesorio de movimiento predeterminado para que lo cubra. Hecho.

Cuestiones relacionadas