iphone - UITableViewCell hace que el fondo de la etiqueta sea claro cuando está resaltado
objective-c uilabel (10)
Tengo una UIlabel en una UITableViewCell, que he creado mediante programación (es decir, no una punta o una subclase).
Cuando la celda se resalta (se pone azul) hace que todos los colores de fondo de los UILabels se vuelvan claros. Tengo 2 UILabels donde no quiero que este sea el caso. Actualmente estoy usando UIImageViews detrás de UILabel para que parezca que el color de fondo no cambia. Pero esta parece una forma ineficiente de hacerlo.
¿Cómo puedo detener el cambio del color de fondo de UILabel cuando se resalta la UITableViewCell?
Acabo de crear un indicador en la subclase UILabel para deshabilitar el cambio de color de fondo después de awakeFromNib o init. Esto permite que el color inicial configurado en el guión gráfico surta efecto. Y no tenemos que llamar a ningún método adicional.
@implementation MWPersistentBGLabel {
BOOL disableBackgroundColorChange;
}
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setup];
}
return self;
}
- (void)awakeFromNib {
[super awakeFromNib];
[self setup];
}
- (void)setup {
// disable background color change after setup is called
disableBackgroundColorChange = YES;
}
// if we ever have to change the color later on, we can do so with this method
- (void)setPersistentBackgroundColor:(UIColor*)color {
[super setBackgroundColor:color];
}
- (void)setBackgroundColor:(UIColor *)color {
if (!disableBackgroundColorChange) {
[super setBackgroundColor:color];
}
// do nothing - background color never changes
}
@end
De forma alternativa, subclase la etiqueta en la que no desea cambiar el color:
@interface PersistentBackgroundLabel : UILabel {
}
- (void)setPersistentBackgroundColor:(UIColor*)color;
@end
@implementation PersistentBackgroundLabel
- (void)setPersistentBackgroundColor:(UIColor*)color {
super.backgroundColor = color;
}
- (void)setBackgroundColor:(UIColor *)color {
// do nothing - background color never changes
}
@end
A continuación, establezca el color una vez explícitamente utilizando setPersistentBackgroundColor :. Esto evitará cambios de color de fondo desde cualquier lugar sin utilizar su método de cambio de color de fondo explícito personalizado.
Esto tiene la ventaja de eliminar también el fondo claro en la etiqueta durante las transiciones.
En mis aplicaciones tuve que cambiar el color azul del estilo de selección de uitableviewcell, así que tuve que configurar la vista de uiimage, cuando hice clic en la celda se destacó como Imageview. Y eliminé el resaltado de la celda cuando volví a la vista. Y no pude entender tu problema claramente. Así que solo me dieron mi código y prueban este,
cellForRowAtIndexPath Method:
CGRect a=CGRectMake(0, 0, 300, 100);
UIImageView *bImg=[[UIImageView alloc] initWithFrame:a];
bImg.image=[UIImage imageNamed:@"bg2.png"];
[bImg setContentMode:UIViewContentModeScaleToFill];
cell.selectedBackgroundView=bImg;
[bImg release];
-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:YES];
NSIndexPath *deselect = [self.tableView indexPathForSelectedRow];
[self.tableView deselectRowAtIndexPath:deselect animated:NO];
}
La mejor de las suertes
Establezca el color de fondo en label.layer.backgroundColor puede solucionar esto.
Parece que cell cambiará backgroundColor de UILabel al resaltar.
Necesita subclasificar UITableViewCell y anular los dos métodos siguientes:
C objetivo:
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
UIColor *backgroundColor = self.myLabel.backgroundColor;
[super setHighlighted:highlighted animated:animated];
self.myLabel.backgroundColor = backgroundColor;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
UIColor *backgroundColor = self.myLabel.backgroundColor;
[super setSelected:selected animated:animated];
self.myLabel.backgroundColor = backgroundColor;
}
Rápido
override func setSelected(selected: Bool, animated: Bool) {
let color = self.myLabel.backgroundColor
super.setSelected(selected, animated: animated)
self.myLabel.backgroundColor = color
}
override func setHighlighted(highlighted: Bool, animated: Bool) {
let color = self.myLabel.backgroundColor
super.setHighlighted(highlighted, animated: animated)
self.myLabel.backgroundColor = color
}
No pude lograr que la respuesta aceptada funcionara; no es que yo piense que la respuesta es incorrecta (ni mucho menos, eso parece ser el Camino Correcto), pero mientras escribía mi primera aplicación iOS mi cabeza ya estaba girando con subclases. Así que decidí hacer trampa.
Digamos que la celda personalizada fue controlada por una clase TableViewCell
. UIImageView
un archivo .png
píxel único del color de fondo correcto y creé un objeto UIImageView
en mi celda personalizada. Utilicé el inspector de Atributos para establecer la imagen por defecto y usé ''Escalar para rellenar''. Para un poco más de atractivo visual, agregué lo siguiente a los atributos de tiempo de ejecución definidos por el usuario en el inspector de identidad:
KeyPath Type Value
layer.cornerRadius Number 4
layer.masksToBounds Boolean YES
Voilá, esquinas redondeadas a bajo precio.
Posicionado directamente detrás de UILabel, se ve el negocio, aunque obviamente no cambiará de tamaño con el contenido (ya que el único contenido es su propia imagen). No es un problema para mí, ya que los datos que se muestran deben tener un tamaño fijo de todos modos.
En algunos valores, era bueno tener un color diferente, que se puede configurar muy fácilmente:
cell.deviceDetailBackground.image = [UIImage imageNamed:@"detailBackground2.png"];
Donde ''cell'' es la encarnación de mi celda personalizada en el método cellForRowAtIndexPath
, creado usando la TableViewCell *cell;
. ¿No hay información para mostrar?
cell.deviceDetailBackground.image = nil;
Estoy seguro de que habrá una buena razón por la cual esta es una idea tonta, pero como estoy comenzando con el desarrollo de iOS, esta fue una solución fácil que funcionó para mí. Siéntase libre de decirme por qué no hacerlo!
Otra forma de evitar que el color de fondo cambie al resaltado es establecer la propiedad backgroundColor
en la layer
de la etiqueta en lugar de en la propia etiqueta.
#import <QuartzCore/QuartzCore.h>
...
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// Get a table cell
UITableViewCell *cell = [tableView dequeueReusableCellForIdentifier:@"cell"];
// Set up the table cell
cell.textLabel.text = @"This is a table cell.";
// If you''re targeting iOS 6, set the label''s background color to clear
// This must be done BEFORE changing the layer''s backgroundColor
cell.textLabel.backgroundColor = [UIColor clearColor];
// Set layer background color
cell.textLabel.layer.backgroundColor = [UIColor blueColor].CGColor;
return cell;
}
La layer
no se ve afectada por el resaltado o selección de celda.
Puede que me equivoque, pero no pude encontrar la manera de anular directamente un getter / setter existente en Swift. Partiendo de la respuesta de user479821, encontré una solución alternativa que parece producir los resultados deseados. Agregué las anotaciones IBDesignable / IBInspectable en caso de que use el guión gráfico, que representa el color final en el editor.
@IBDesignable
class PersistentBackgroundLabel: UILabel {
@IBInspectable var persistentBackgroundColor: UIColor = UIColor.clearColor() {
didSet {
super.backgroundColor = persistentBackgroundColor
}
}
override var backgroundColor: UIColor? {
didSet {
if backgroundColor != persistentBackgroundColor {
backgroundColor = persistentBackgroundColor
}
}
}
}
Tengo el mismo problema y creo que es una especie de error de UIKit framework. Gracias a Dios, tengo una solución: ¡el orden importa! Solo sigue la secuencia:
- (void)tableView:(UITableView *)t willDisplayCell:(UITableViewCell*)c forRowAtIndexPath:(NSIndexPath *)i {
UIColor *bgc = [UIColor redColor];
// Set up the cell in following order:
c.textLabel.backgroundColor = bgc;
c.backgroundColor = bgc;
c.textLabel.text = @"foo";
}
No sé por qué, pero esta secuencia funciona bien y el otro orden hace que parezca como si c.textLabel.backgroundColor se viera obligado a borrar Color en algunas celdas después de anular su selección.
No fue un comportamiento aleatorio, sucedió la primera vez que las células fueron reutilizadas, no cuando fueron creadas, ni cuando fueron reutilizadas en segundo lugar. Con la solución, funciona bien siempre.
Tuve que crear una subclase de UItableView, crear una lista de etiquetas de la vista que no quiero que sean transparentes, y anular el método setHighlighted: animado para que restablezca el color de fondo de las etiquetas específicas. longwinding y fidely, si tan solo tuviera el código fuente t la clase real de UItableViewCell.