Tengo una simple tableViewCell construir en el interface builder.
Contiene una UIView que contiene una imagen.
Ahora, cuando yo seleccione la celda, el valor predeterminado de selección azul de fondo se muestra, pero en el fondo de mi UIView se ha ido.

Mi UITableViewCell archivo de implementación de la de no hacer nada especial. Sólo init & devuelve el auto y todo lo que hago en setSelected es llamar a super.

¿Cómo puedo obtener mi UIView backgroundColor para mostrar cuando el formato tableview es seleccionado?

  • ¿Qué otros elementos de la interfaz se encuentran dentro de la vista, que se cubren por la selección de celdas de color?
  • En la actualidad Es sólo una imagen. Es el propósito de hacer que la imagen se vea como una fotografía. Más tarde, voy a ser la adición de una etiqueta en allí también.
InformationsquelleAutor P5ycH0 | 2011-03-07

16 Comentarios

  1. 106

    El problema aquí es que el [super] implementación de

    - (void) setSelected:(BOOL) selected animated:(BOOL) animated;

    conjuntos de todos los colores de fondo en la UITableViewCell a rgba(0,0,0,0). Por qué? Tal vez para hacer de todos nosotros sudor?

    No es que toda vistas a desaparecer (como lo demuestra el hecho de que si se cambian las vistas de la capa de propiedades de borde, aquellos que se conservan)

    Aquí está la secuencia de llamadas a la función que resulta del contacto con una célula

    1. setHighlighted
    2. touchesEnded
    3. layoutSubviews
    4. willSelectRowAtIndexPath (delegado lado)
    5. setSelected (!!! este es el lugar donde todas sus ver los colores de fondo se dijo a desaparecer)
    6. didSelectRowAtIndexPath (delegado lado)
    7. setSelected (nuevo) (Curiosamente los colores de fondo no se borra en la presente convocatoria. Lo extraño está pasando en el interior que super método?)
    8. layoutSubviews (de nuevo)

    Así que sus opciones son

    1. Reemplazar – (void) setSelected:(BOOL) seleccionado animados:(BOOL) animados; sin llamar [super setSelected:seleccionado de animación:animación]. Esto le dará a usted la más técnicamente correcta implementación, debido a que a) el código está envuelto dentro de la UITableViewCell subclase y b) porque se llama sólo cuando sea necesario (bueno dos veces cuando es necesario, pero tal vez hay una forma de hacerlo). El lado negativo es que tendrás que volver a implementar todas las funciones necesarias (como contraposición a la innecesaria color de compensación de funciones) de setSelected. Ahora no me preguntes cómo reemplazar correctamente setSelected todavía. Su conjetura es tan buena como la mía por ahora (ser paciente, voy a editar esta respuesta una vez que averiguar).
    2. Re-afirmar los colores de fondo en didSelectRowAtIndexPath. Esto no es tan grande porque pone lo que debería ser ejemplo de código fuera de la instancia. Tiene la ventaja de que sólo se llama cuando es necesario, como contraposición a …
    3. Re-afirmar los colores de fondo en layoutSubviews. Esto no es de gran ayuda porque layoutSubviews se denomina como UN MILLÓN de veces! Es llamado cada vez que la tabla se actualiza cada vez que se desplaza, cada vez que la abuela recibe una perm… como en serio, un millón de veces. Eso significa que hay un montón de fondo innecesarios re-afirmaciones y una cantidad adicional de la sobrecarga de procesamiento. En el lado positivo se pone el código dentro de la UITableViewCell subclase, lo cual es bueno.

    Lamentablemente re-afirmación de los colores de fondo en setHighlighted no hace nada porque setHighlighted se llama antes de que todos los colores de fondo de obtener ajustado a [r:0 b:0 g:0 a:0] por la primera llamada a setSelected.

    //TODO: Dar una buena descripción de cómo reemplazar setSelected (estad atentos)

    • Gran respuesta. Hace un montón de sentido!. Voy a permanecer atentos para el reemplazo 😉
    • Sólo un seguimiento. He metido con esto bastante, pero todavía no he encontrado lo que yo llamaría un lugar limpio, solución genérica para reemplazar setSelected. Si/cuando yo voy a publicar más información…. Feliz codificación
    • Gracias por alegrar un día estresante!
    • si está configurando el UIView color de fondo en setSelected también se debe establecer que es setHighlighted o usted puede ver algunos de parpadeo.
    • Al menos en iOS 7, también puede establecer la célula selectionStyle a UITableViewCellSelectionStyleNone, y no va a borrar los orígenes. La única desventaja es que se ignore la selectedBackgroundView de la propiedad.
    • Primordial setHighlighted funcionado mejor para mí

  2. 68
    - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
    {
        UIColor *backgroundColor = self.channelImageView.backgroundColor;
        [super setHighlighted:highlighted animated:animated];
        self.channelImageView.backgroundColor = backgroundColor;
    }
    
    - (void)setSelected:(BOOL)selected animated:(BOOL)animated
    {
        UIColor *backgroundColor = self.channelImageView.backgroundColor;
        [super setSelected:selected animated:animated];
        self.channelImageView.backgroundColor = backgroundColor;
    }
    • Gran solución. Mucho más limpio que el de todos los de la subclase y CALayer soluciones.
    • Gracias! Su solución es la mejor!
    • Este fue el más útil respuesta para mí. Modificado un poco de mi caso de uso (varias celdas con múltiples bloqueado de fondo de la vista), pero felicitaciones por la solución de trabajo!
    • Solución perfecta, muchas gracias!
  3. 16

    Anteriormente he hecho como @P5ycH0 dijo (1×1 imagen estirada), pero seguir a @Brooks pensé que reemplazar -(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated en mi costumbre UITableViewCell la implementación y el restablecimiento de los colores en el fondo después de llamar a [super setHighlighted:highlighted animated:animated]; mantiene a mi los colores de fondo cuando se selecciona la celda/destacado

    -(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
        [super setHighlighted:highlighted animated:animated];
        myView.backgroundColor = myColor;
    }
    • Esto hizo que el truco para mí.
    • Mejor solución 😄
    • Gracias estaba buscando durante 2 días
    • Guardar mi tiempo muchas Gracias
    • Yo pienso que este setHighlighted función es creado para personalizar el comportamiento del sistema cuando la celda está seleccionada, por cierto, buen trabajo
  4. 15

    Cuando su UITableViewCell es seleccionado, hay dos estados en los que debe prestar atención a: Highlighted y Selected.

    Así, para los casos de que tienes un custom clase de células que es subclase de UITableViewCell, usted puede fácilmente reemplazar estos dos métodos para evitar esta situación(Swift):

    class MyCell: UITableViewCell {
    
        @IBOutlet var myView: UIView!
    
        override func setHighlighted(highlighted: Bool, animated: Bool) {
            let myViewBackgroundColor = myView.backgroundColor
            super.setHighlighted(highlighted, animated: animated)
            myView.backgroundColor = myViewBackgroundColor
        }
    
        override func setSelected(selected: Bool, animated: Bool) {
            let myViewBackgroundColor = myView.backgroundColor
            super.setSelected(selected, animated: animated)
            myView.backgroundColor = myViewBackgroundColor
        }
    
    }
    • mejor respuesta rápida
  5. 4

    Brooks tiene una gran explicación de por qué sucede esto, pero creo que tengo una solución mejor.

    En la subvista, anular setBackgroundColor: a lo que es el color que desee. El setter todavía ser llamado, pero sólo su color especificado serán aplicadas.

    - (void)setBackgroundColor:(UIColor *)backgroundColor {
        [super setBackgroundColor:[UIColor whiteColor]];
    }
  6. 3

    Ok, perder el color de fondo de una UIView clase de comportamiento es normal cuando se encuentra en un seleccionado tableviewcell.
    Yo no podía entender cómo prevenirlo.
    Ahora sólo he sustituido el UIView con un UIImageView que contiene una estirada de 1×1 píxel blanco.
    Feo de la omi, pero funciona.

  7. 3

    Que usted necesita para reemplazar los próximos dos métodos en su celda personalizada:

    - (void) setSelected:(BOOL)selected animated:(BOOL)animated;
    - (void) setHighlighted:(BOOL)highlighted animated:(BOOL)animated;

    Tenga en cuenta que:

    • usted debe llamar a [super setSelected:animated:] y [super setHighlighted:animated:] en el comienzo de su implementación personalizada o corresponden métodos;
    • debe establecer el UITableViewCellSelectionStyleNone selectionStyle de su celda personalizada, para desactivar cualquier defecto UITableViewCell estilo;

    Aquí el ejemplo de la aplicación:

    - (void) setHighlighted:(BOOL)highlighted animated:(BOOL)animated
    {
        [super setHighlighted:highlighted animated:animated];
        [self setHighlightedSelected:highlighted animated:animated];
    }
    
    - (void) setSelected:(BOOL)selected animated:(BOOL)animated
    {
        [super setSelected:selected animated:animated];
        [self setHighlightedSelected:selected animated:animated];
    }
    
    - (void) setHighlightedSelected:(BOOL)selected animated:(BOOL)animated
    {
        void(^selection_block)(void) =
        ^
        {
            self.contentView.backgroundColor = selected ? SELECTED_BACKGROUND_COLOR : NORMAL_BACKGROUND_COLOR;
        };
    
        if(animated)
        {
            [UIView animateWithDuration:SELECTION_ANIMATION_DURATION
                                  delay:0.0
                                options:UIViewAnimationOptionBeginFromCurrentState
                             animations:selection_block
                             completion:NULL];
        }
        else
            selection_block();
    }

    La contentView es la propiedad de UITableViewCell que se apareció en iOS 7. Tenga en cuenta que usted puede utilizar su propia celda del niño de la vista o vistas en lugar de ella.

  8. 1

    Agregar esto a su UITableViewCell

    override func setHighlighted(highlighted: Bool, animated: Bool) {
        super.setHighlighted(false, animated: animated)
        if highlighted {
            self.backgroundColor = UIColor.blueColor()
        }else{
            UIView.animateWithDuration(0.2, animations: {
                self.backgroundColor = UIColor.clearColor()
            })
        }
    }
  9. 1

    Relacionadas con @Brooks de la respuesta, esto es lo que yo hice para que funcione en Swift y iOS8/iOS9.

    • Reemplazar el setSelected y setHighlighted
    • No llamar a super
    • Claro que la contentView.backgroundColor, porque no tiene que abarcar todo el ancho de la celda (es decir, los accesorios).
    • Utilizar el backgroundColor de la misma célula, y ajustar en consecuencia.

  10. 1

    Resumen

    Esta solución le permite bloqueo de algunas de las células de los colores de fondo, mientras que el resto son controlados por el comportamiento del sistema.


    Basado en mientus’ respuesta, he creado una solución que permite a especificar que las vistas deben de mantener su color de fondo.

    Esto permite otras células subvistas tener su fondo se ha eliminado en resaltando/selección, y es la única solución que funciona en nuestro caso (dos puntos de vista la necesidad de un fondo permanente).

    He utilizado un protocolo orientado al enfoque, con un BackgroundLockable protocolo que contiene la lista de vistas a la cerradura, y la ejecución de un cierre, manteniendo los colores:

    Entonces tengo una subclase de UITableViewCell, que reemplaza el resaltado y la selección para ejecutar el protocolo de cierre alrededor de llamada predeterminado (super) comportamiento:

    Ahora sólo tengo subclase LockableBackgroundTableViewCell o utilizar el BackgroundLockable protocolo en una clase de células para añadir fácilmente el bloqueo de comportamiento de algunas células!

  11. 0

    De que usted dijo que se construyó un tableViewCell el uso de IB, me gustaría comprobar si usted está agregando a su vista como una subvista de contentView de UITableViewCell, no view. El contenido de la vista es el valor predeterminado superview para los contenidos que se muestran en la célula.

    De la referencia:

    La vista del contenido de un UITableViewCell el valor predeterminado es objeto superview para los contenidos que se muestran en la célula. Si desea personalizar las células mediante la adición de vistas adicionales, se debe agregar a la vista del contenido, de modo que será posicionado apropiadamente como la célula transiciones dentro y fuera del modo de edición.

    • Mi punto de vista hierachie en InterfaceBuilders UITableViewCell es TableViewCell>Ver>ImageView. Si yo fuera la construcción de la tableViewCell con el código, podría haber incluido por error mi punto de vista a la tableviewcell la vista en lugar de la contentView, Pero no veo cómo podría hacer que el error en el IB… Nota de que mi imagen se ve, pero el principal elemento de vista no lo es.
  12. 0

    Puede cambiar el comportamiento de la tableViewCell reemplazando la función setHighlighted en UITableViewCell clase (se necesita heredar de ella). Ejemplo de mi código donde puedo cambiar la imagen de fondo de mi celular :

    También puede cambiar el modo de selección de color gris, azul o ninguno en el interface builder.

    • Sí, lo sé. pero ese no era el problema que tenía. Me preguntaba si me podrían evitar perder el color de fondo de una UIView basado elemento cuando es seleccionada tableviewcell. He encontrado una solución mediante el uso de un imageview en lugar de una vista.
    • Sin embargo, Más Información: En mi última prueba que mostró que los colores de fondo se limpian CADA vez que se selecciona una celda, no sólo después de la inicialización o lo que sea. La secuencia de los acontecimientos parece ser 1) setHighlighted llamado 2)touchesEnded llamado 3) layoutSubviews llamado 4) didSelectRowAtIndexPath llamado 4) layoutSubviews llama de nuevo. Los colores de fondo parecen tener desactivada justo antes de didSelectRowAtIndexPath
  13. 0

    En iOS 7, lo que funcionó para mí es reemplazar setSelected:animated: en el UITableViewCell subclase, pero contrario a @Brooks punta, me llama [super setSelected:selected animated:animated].

    Esto me permite mantener el defecto del sistema de selección de la animación cuando el usuario pulsa en la celda, y también para eliminar la selección en la vista de tabla del delegado didSelectRowAtIndexPath:.

  14. 0

    Acaba de pasar algún tiempo en este extraño asunto. Yo no quería fijar UITableViewCellSelectionStyleNone estilo para preservar bonita animación cuando mi fila seleccionada. Pero ninguna de las ideas sugeridas funcionó para mí – yo estaba tratando de reemplazar setSelected y setHighlighted y fije mi vista backgroundColor allí – fue mantener el restablecimiento de iOS y parpadeando (nuevo color -> color más antiguo).
    Para mí la solución era bastante sencilla.
    Cuando mi fila se selecciona otro punto de vista controlador es empujado, el usuario elige la opción de que la pantalla y el delegado se llama donde puedo cambiar el color según la selección del usuario. En este delegado acabo de hacer [cell setSelected:NO animado:NO] para mi celular. (He estática UITableViewController y tienen puntos de venta a las células).
    Usted probablemente podría anular la selección de la celda en didSelect método, pero en mi caso estoy usando desemboca.

  15. 0

    Aquí está mi opinión sobre ella. Tengo una subclase que todas mis células heredar de, así que esa es la manera en que lo hago para evitar el cambio de fondo en mi UIImageViews:

    Este automaticlly arreglar el problema de todos los UIImageView.

Dejar respuesta

Please enter your comment!
Please enter your name here