Allineamento etichetta in iOS 6 - UITextAlignment obsoleto


190

Sembra UITextAlignmentCenterdeprecato in iOS 6.

Lo uso ancora e funziona bene, ma dà un avvertimento.

Come posso risolvere questo problema?

label.textAlignment = UITextAlignmentCenter;

Grazie.


7
Un'ipotesi plausibile: NSTextAlignment.
JustSid

1
Utilizzare invece NSTextAlignment.
Jayprakash Dubey,

Risposte:


394

In iOS6 puoi usare

label.textAlignment = NSTextAlignmentCenter;

Spero che questo ti aiuti.


È possibile che l'enum possa cambiare in qualche momento in futuro e causare risultati inaspettati. È tutto. Nessuno scenario del giorno del giudizio in questo caso, ma dovrebbero prevalere le migliori pratiche.
Brenden,

17
majorl3oat: NON è consigliabile utilizzare un numero costante anziché enum. L'enum aiuta con la leggibilità del codice che è un fattore estremamente importante. Che potrebbe rompersi in futuro è solo un cattivo progetto di Apple, e se lo rompono preferirei avere errori di compilazione piuttosto che rischiare che l'allineamento si sbagli senza che me ne accorga.
Robin Andersson,

6
Robin è COMPLETAMENTE corretto. L'uso di una enum è la migliore pratica, senza dubbio. Puoi SEMPRE presumere che NSTextAlignmentCenter significhi CENTRO, in nessun caso puoi supporre che 1 significhi sempre CENTRO. A meno che Apple non sia completamente stupida.
Rasmus

un enum è specificamente quindi il codice non si romperà in futuro. Se decidono che 1 dovrebbe essere un 42, l'enum continuerà a funzionare, il valore hardcoded fallirà.
Bryan Oakley,

Sì, rimuovi textAlignment = 1, confonderà le persone e diffonderà cattive conoscenze
MobileMon

45

La labelAlignmentmodifica della proprietà è probabilmente correlata all'introduzione di NSAttributedStrings da parte di Apple in più controlli iOS e, pertanto, è necessario modificare le proprietà UIText ... in NSText ...

Quindi, se hai eseguito l'aggiornamento a iOS6, sei in trifoglio; basta passare da UITextAlignmentCentera NSTextAlignmentCentere godere delle nuove stringhe di fantasia.

Ma se stai lavorando con un progetto complesso e preferisci che la terra non si muova così tanto sotto i tuoi piedi, potresti voler rimanere con una versione precedente per un po 'e adattare il tuo codice per più versioni, qualcosa del genere:

// This won't compile:
if ([label respondsToSelector:@selector(attributedText:)]) 
    label.textAlignment = UITextAlignmentCenter;
else 
    label.textAlignment = NSTextAlignmentCenter;

L'approccio sopra funziona per nuovi metodi ; ricevi avvisi ma tutto funziona bene. Ma quando il compilatore vede una costante di cui non è a conoscenza, diventa rosso e si ferma nelle sue tracce. Non c'è modo di passarci di soppiatto NSTextAlignmentCenter. (Beh, potrebbe esserci un modo per personalizzare il comportamento del compilatore qui, ma sembra sconsigliabile.)

La soluzione alternativa consiste nell'aggiungere alcuni definitivi preprocessori condizionali. Se metti qualcosa del genere nel file h della tua classe (o forse in un file di costanti importato - che deve essere incluso #import <UIKit/UIKit.h>per poter conoscere il NSText ... costanti) ...

#ifdef NSTextAlignmentCenter // iOS6 and later
#   define kLabelAlignmentCenter    NSTextAlignmentCenter
#   define kLabelAlignmentLeft      NSTextAlignmentLeft
#   define kLabelAlignmentRight     NSTextAlignmentRight
#   define kLabelTruncationTail     NSLineBreakByTruncatingTail 
#   define kLabelTruncationMiddle   NSLineBreakByTruncatingMiddle
#else // older versions
#   define kLabelAlignmentCenter    UITextAlignmentCenter
#   define kLabelAlignmentLeft      UITextAlignmentLeft
#   define kLabelAlignmentRight     UITextAlignmentRight
#   define kLabelTruncationTail     UILineBreakModeTailTruncation
#   define kLabelTruncationMiddle   UILineBreakModeMiddleTruncation
#endif

…Puoi farlo:

label.textAlignment = kLabelAlignmentCenter;

E questo:

label.lineBreakMode = kLabelTruncationMiddle;

Eccetera.

Poiché è probabile che queste modifiche a UIText / NSText vengano visualizzate per più controlli, questo approccio è abbastanza utile.

(Avvertenza: essendo un membro dei suddetti amanti della terra ferma, l'ho testato con una vecchia versione, ma non ancora con iOS6.)


A partire da Xcode 9 iOS 11.4 SDK, questa è ancora la soluzione per me. [labelOne setFont: [UIFont fontWithName: @ dimensione "HelveticaNeue": 20]]; labelOne.textAlignment = NSTextAlignmentLeft; // Estratto - kCTLeftTextAlignment; labelOne.text = dateStr; [headerView addSubview: labelOne];
Matthew Ferguson,

19

NSTextAlignmentCenterpuò essere utilizzato al posto di UITextAlignmentCentere un elenco di altri sostituti è di seguito:

#ifdef __IPHONE_6_0 // iOS6 and later
#   define UITextAlignmentCenter    NSTextAlignmentCenter
#   define UITextAlignmentLeft      NSTextAlignmentLeft
#   define UITextAlignmentRight     NSTextAlignmentRight
#   define UILineBreakModeTailTruncation     NSLineBreakByTruncatingTail
#   define UILineBreakModeMiddleTruncation   NSLineBreakByTruncatingMiddle
#endif

1
Questo funziona per me. Testato sul simulatore per iOS 6.1 e iOS 5.0.
JScarry,

15
#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_6_0)
# define ALIGN_CENTER NSTextAlignmentCenter
#else
# define ALIGN_CENTER UITextAlignmentCenter
#endif

UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 30)];
label.text = @"There is no spoon";
label.textAlignment = ALIGN_CENTER;
[self addSubview:label];

Una costruzione migliore sarebbe usare qualcosa di più simile a: #ifdef (__IPHONE_OS_VERSION_MIN_REQUIRED> = __IPHONE_6_0) .... Altrimenti otterrai UITextAlignmentCenter in iOS 7.
Correzione Ray

13

Non devi fare nessuno di questi. Xcode 4.5 compilerà NSTextAlignmentCenter, ecc. Bene in iOS 5.


1
Questo sembra essere vero. Ho il problema con UILineBreakMode e UITextAlignment-- e la loro sostituzione con NSLineBreakMode e NSTextAlignment-- funziona bene in Xcode 4.6.3 nel simulatore 5.0 e su un iPad che esegue 5.-.
JScarry,

2
UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 150, 40)];
[label1 setText:@"Your String"];
[label1 setBackgroundColor:[UIColor clearColor]];
[label1 setNumberOfLines:0];
[label1 sizeToFit];

//For Center Alignment
[label1 setTextAlignment:NSTextAlignmentCenter];

//For Right Alignment
[label1 setTextAlignment:NSTextAlignmentRight];

//For Left Alignment
[label1 setTextAlignment:NSTextAlignmentLeft];

// Add the label into the view

[self.view addSubview:label1];


0

Ho avuto un problema simile e ho usato quanto segue: detailsLabel.textAlignment = NSTextAlignmentCenter;


0

in iOS 6 o versioni successive

usa questo valore:

self.lbl_age.textAlignment=NSTextAlignmentCenter;


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.