2010-01-12 6 views
20

Sto aggiungendo un'istanza UILabel come sottoview delle mie istanze personalizzate UITableViewCell dell'istanza contentView.UILabel sfocata come subview programmatico di UITableViewCell contentView

Quando seleziono la cella, la riga viene evidenziata in blu, ad eccezione dello sfondo dell'etichetta. Il testo dell'etichetta è nitido.

Quando si imposta la proprietà backgroundColor di visualizzazione del contenuto su [UIColor clearColor], il testo dell'etichetta diventa sfocato.

Come impostare il colore dello sfondo dell'etichetta in modo che sia chiaro, per consentire l'evidenziazione della riga, mantenendo comunque il testo dell'etichetta nitido?

Un suggerimento che ho letto altrove era a round valori dell'etichetta frame, ma questo non ha avuto alcun effetto.

CODICE

Ecco un frammento di -setNeedsLayout metodo mia abitudine UITableViewCell di visualizzazione secondaria:

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; 
+0

puoi pubblicare il tuo codice sorgente? –

+0

Si prega di consultare lo snippet di codice aggiunto. –

risposta

35

Il problema è il rendering sub-pixel, che si verifica quando l'origine (che è un valore float) ha un componente frazionario diverso da zero. Arrotondare al numero intero più vicino e si dovrebbe andare bene.

+0

Sto già impostando il frame sui valori interi: '_objectTitleLabel.frame = CGRectIntegral (_objectTitleLabel.frame)' –

+1

E tu sei continua a vedere un problema con i rendering sfocati? Cosa ne pensi della tua vista genitore - sono anch'essi posizionati in modo integrale? –

+4

Attenzione: questo problema si verifica anche quando si imposta il 'centro' di una vista con larghezza e/o altezza dispari. – mvds

2

mi sono imbattuto in questo problema io stesso oggi, e letto da qualche parte che i valori non interi per l'origine e la la dimensione del frame di UILabel può causare questo (so che sono float, ma tu sai cosa intendo). Ci ha avuto modo di essere una soluzione più elegante, ma questo trucco veloce sembra aver risolto il problema per me:

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

Se si trova una soluzione migliore, per favore fatemelo sapere, mi piacerebbe sostituire questo hack con qualcosa di un po 'più di buon gusto.

+0

Sto già impostando il frame sui valori interi: '_objectTitleLabel.frame = CGRectIntegral (_objectTitleLabel.frame)' –

1

A volte il motivo della sfocatura che hai citato può essere che la cornice delle etichette è oltre la cornice della cella. Anche se si vede tutto il testo inserito nell'etichetta sulla cella, la dimensione effettiva dell'etichetta può essere maggiore della cornice della cella.

Per verificare se questo è il motivo dell'effetto che vedete, suggerirei di controllare/stampare tutti i dati relativi alle dimensioni/posizione delle etichette dopo l'istanziazione e di controllare la tabella dei metodi delegati. View: heightForRowAtIndexPath: that this adattarsi all'altezza della cella che si sta restituendo per la cella. Spero che ti aiuti nel tuo caso.

7

Ok trovato il problema, Assicurati che anche le coordinate della tua genitore siano arrotondate.

1

Utilizzare round(); Le funzioni C sono fornite per un motivo.

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

Tutto ciò di cui hai bisogno.

+2

Come già detto, ho aggiunto '_objectTitleLabel.frame = CGRectIntegral (_objectTitleLabel.frame);' nessun effetto. –

1

-setNeedsLayout viene chiamato anche per le celle riutilizzabili in coda? Se è così, la cella avrà già l'etichetta aggiunta alla vista del contenuto e la disegnerai due volte, rendendola sfocata.È inefficiente possibile risolvere questo problema rimuovendo tutti subviews della vista dei contenuti prima di aggiungere la vostra visualizzazione secondaria:

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

Una soluzione migliore sarebbe quella di fornire immobili in sottoclasse cellulare che permette di modificare il contenuto di un'as- cellulare riutilizzato necessario, piuttosto che ricostruire la sua gerarchia delle viste da zero.

2

Un'altra causa di testo distorto/sfocato è il riutilizzo delle celle. Se disattivi una cella riutilizzabile, potrebbe ridisegnare con dimensioni diverse da qualche altra parte e nuovamente essere riutilizzata quando arriva alla tua cella con il testo confuso.

Per garantire che le celle siano univoche, assicurarsi di allocare una nuova cella per gli indirizzi in cui il testo è confuso e contrassegnare l'istanza di UITableViewCell con un identificatore di riutilizzo differente. Questo è ovviamente pratico se hai a che fare con un numero molto piccolo di celle e se sai esattamente quali celle stanno causando problemi.

8

Nel mio caso, aver impostato shouldRasterize = YES sul CGLayer della vista contenente UILabel era il colpevole. Rimozione di quella linea ha reso il testo piacevole e nitido.

+0

corretto. Ma se stai usando 'UITableViewCell' questo potrebbe introdurre una scrollata nella scroll. In tal caso, imposta la scala di Rasterizzazione. –

+0

Questo è un buon consiglio. Ho finito per fare il disegno personalizzato completo con Quartz nella mia cella tableview e ora è velocissimo! –

+0

Questo ha funzionato per ME !!! GRAZIE MILLE!! – reidisaki

2

L'impostazione shouldRasterize a YES può causare sfocatura. Imposta la scala di rasterizzazione e questo dovrebbe eliminare la sfocatura. [self.layer setRasterizationScale:[[UIScreen mainScreen] scale]];

Problemi correlati