color iphone uiview uitableview colors uilabel

iphone - gradient background color swift 4



UILabel borrosa como subvista programática del contenido de UITableViewCellView (9)

¿ -setNeedsLayout llama a -setNeedsLayout incluso para celdas reutilizables retiradas de la cola? Si es así, la celda ya tendrá la etiqueta agregada a la vista de contenido, y la dibujarás dos veces, haciéndola borrosa. Puede resolver esto de manera ineficiente eliminando todas las subvistas de la vista de contenido antes de agregar su subvista:

for (UIView *subview in [[self contentView] subviews]) { [subview removeFromSuperview]; }

Una mejor solución sería proporcionar propiedades en la subclase de su celda para permitirle modificar el contenido de una celda reutilizada según sea necesario, en lugar de reconstruir su jerarquía de vistas desde cero.

Estoy agregando una instancia de UILabel como una subvista de la vista personalizada de mi instancia de contentView .

Cuando selecciono la celda, la fila se resalta en azul, excepto por el fondo de la etiqueta. El texto de la etiqueta es nítido.

Cuando configuro la propiedad backgroundColor la etiqueta y el contenido en [UIColor clearColor] , el texto de la etiqueta se vuelve borroso.

¿Cómo establezco que el color de fondo de la etiqueta sea claro, para permitir que aparezca el resaltado de la fila, mientras mantengo el texto de la etiqueta nítido?

Una sugerencia que leí en otra parte era round los valores de frame la etiqueta, pero esto no tuvo ningún efecto.

CÓDIGO

Aquí hay un fragmento de mi UITableViewCell personalizado de la subvista -setNeedsLayout :

UILabel *_objectTitleLabel = [[UILabel alloc] initWithFrame:CGRectNull]; _objectTitleLabel.text = [self.awsObject cleanedKey]; _objectTitleLabel.font = [UIAppDelegate defaultObjectLabelFont]; _objectTitleLabel.highlightedTextColor = [UIColor clearColor]; //[UIAppDelegate defaultLabelShadowTint]; _objectTitleLabel.backgroundColor = [UIColor clearColor]; //[UIAppDelegate defaultWidgetBackgroundTint]; _objectTitleLabel.frame = CGRectMake( kCellImageViewWidth + 2.0 * self.indentationWidth, 0.5 * (self.tableView.rowHeight - 1.5 * kCellLabelHeight) + kCellTitleYPositionNudge, contentViewWidth, kCellLabelHeight ); _objectTitleLabel.frame = CGRectIntegral(_objectTitleLabel.frame); _objectTitleLabel.tag = kObjectTableViewCellTitleSubviewType; //NSLog(@"_objectTitleLabel: %@", NSStringFromCGRect(_objectTitleLabel.frame)); [self.contentView addSubview:_objectTitleLabel]; [_objectTitleLabel release], _objectTitleLabel = nil; ... self.contentView.backgroundColor = [UIAppDelegate defaultWidgetBackgroundTint]; self.contentView.clearsContextBeforeDrawing = YES; self.contentView.autoresizesSubviews = YES; self.contentView.clipsToBounds = YES; self.contentView.contentMode = UIViewContentModeRedraw;


A veces, el motivo de la imagen borrosa que ha mencionado puede ser que el marco de las etiquetas está más allá del marco de la celda. Incluso si ve todo el texto que ha puesto dentro de la etiqueta en su celda, el tamaño real de la etiqueta puede ser más grande que el marco de la celda.

Para comprobar si ese es el motivo del efecto que ve, le sugeriría que compruebe / imprima todos los datos que tenga sobre el tamaño / ubicación de las etiquetas después de que se cree una instancia y que marque en el método de delegado tableView: heightForRowAtIndexPath: que esto se ajuste a la celda Altura que regresas para la celda. Espero que te ayude en tu caso.


El problema es la representación de subpíxeles, que se produce cuando su origen (que es un valor flotante) tiene un componente fraccional distinto de cero. Redondea al número entero más cercano y estarás bien.


En mi caso, haber establecido shouldRasterize = YES en el CGLayer de la vista que contiene la UILabel fue el culpable. Eliminar esa línea hizo que el texto sea agradable y nítido.


Hoy me encontré con este problema y leí en alguna parte que los valores no enteros para el origen y el tamaño del marco de UILabel pueden causar esto (sé que son flotantes, pero sabes a qué me refiero). Tiene que haber una solución más elegante, pero este rápido truco parece haber resuelto el problema para mí:

self.valueLabel.frame = CGRectMake((int) frame.origin.x, (int) frame.origin.y, (int) frame.size.width, (int) frame.size.height);

Si encuentra una solución mejor, hágamelo saber, me encantaría reemplazar este truco con un poco más de buen gusto.


La configuración debe shouldRasterize a YES puede introducir desenfoque. Establece la escala de rasterización y eso debería eliminar la borrosidad. [self.layer setRasterizationScale:[[UIScreen mainScreen] scale]];


Ok encontré el problema, asegúrese de que las coordenadas de la vista de los padres también estén redondeadas.


Otra causa de texto confuso / borroso es la reutilización de células. Si está retirando una cola de una celda reutilizable, puede volver a dibujar con diferentes dimensiones en otro lugar y volver a utilizarla cuando llegue a su celda con el texto distorsionado.

Para asegurarse de que las celdas sean únicas, asegúrese de asignar una nueva celda para las indicaciones donde el texto está distorsionado, y marque esa instancia de UITableViewCell con un identificador de reutilización diferente. Por supuesto, esto solo es práctico si está tratando con un número muy pequeño de células y si sabe exactamente qué células están causando problemas.


Utilice round (); C funciones se proporcionan por una razón.

#define roundCGRectValues (frame) / frame = CGRectMake(round(frame.origin.x),round(frame.origin.y),round(frame.size.width),round(frame.size.height));

Todo lo que necesita.