Wyrównanie etykiet w iOS 6 - UITextAlignment przestarzałe

190

Wygląda na UITextAlignmentCenterto, że jest przestarzałe w iOS 6.

Nadal go używam i działa dobrze, ale daje ostrzeżenie.

Jak mogę to naprawić?

label.textAlignment = UITextAlignmentCenter;

Dzięki.

użytkownik123
źródło
7
Zgaduje: NSTextAlignment.
JustSid
1
Zamiast tego użyj NSTextAlignment.
Jayprakash Dubey,

Odpowiedzi:

394

W iOS6 możesz użyć

label.textAlignment = NSTextAlignmentCenter;

Mam nadzieję że to pomoże.

majorl3oat
źródło
Możliwe, że wyliczenie MOGĄ ulec zmianie w przyszłości i spowodować nieoczekiwane rezultaty. To wszystko. W tym przypadku nie ma scenariusza dnia zagłady, ale powinny przeważyć lepsze praktyki.
Brenden,
17
majorl3oat: NIE jest najlepszą praktyką stosowanie stałej liczby zamiast wyliczania. Wyliczanie pomaga w czytelności kodu, co jest niezwykle ważnym czynnikiem. To, że może się zepsuć w przyszłości, jest po prostu złym projektem Apple, a jeśli się zepsują, wolę mieć błędy kompilacji niż ryzykować, że wyrównanie nie powiedzie się bez mojej uwagi.
Robin Andersson
6
Robin jest całkowicie poprawny. Bez wątpienia stosowanie najlepszej praktyki enum IS. Możesz ZAWSZE zakładać, że NSTextAlignmentCenter oznacza CENTRUM, nie możesz W ŻADNY SPOSÓB zakładać, że 1 zawsze oznacza CENTRUM. Chyba że Apple jest całkowicie głupi.
Rasmus
wyliczenie jest specyficzne, więc kod nie pęka w przyszłości. Jeśli zdecydują, że 1 powinno być 42, wyliczenie będzie nadal działać, wartość zakodowana na stałe zawiedzie.
Bryan Oakley,
Tak, usuń textAlignment = 1, wprowadzi to zamieszanie i rozpowszechni złą wiedzę
MobileMon
45

Zmiana labelAlignmentwłaściwości jest prawdopodobnie związana z wprowadzeniem przez Apple NSAttributStrings do większej liczby elementów sterujących iOS, a zatem wymaga zmiany właściwości UIText… na NSText….

Jeśli więc uaktualniłeś system do iOS6, jesteś koniczyną; wystarczy przełączyć od UITextAlignmentCenterdo NSTextAlignmentCenteri cieszyć się fantazyjne nowe struny.

Ale jeśli pracujesz nad złożonym projektem i wolisz, aby Ziemia nie poruszała się tak bardzo pod stopami, możesz przez pewien czas trzymać się starszej wersji i dostosować swój kod do wielu wersji, coś takiego:

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

Powyższe podejście działa w przypadku nowych metod ; otrzymujesz ostrzeżenia, ale wszystko działa dobrze. Ale gdy kompilator zobaczy stałą , o której nie wie, zmienia kolor na czerwony i zatrzymuje się. Nie ma sposobu, aby się wymknąć NSTextAlignmentCenter. (Cóż, może istnieć sposób na dostosowanie zachowania kompilatora tutaj, ale wydaje się to niewskazane).

Obejściem tego problemu jest dodanie niektórych warunkowych definicji preprocesora. Jeśli umieścisz coś takiego w pliku h swojej klasy (lub być może w importowanym pliku stałych - który sam musi zawierać #import <UIKit/UIKit.h>, aby kiedykolwiek wiedzieć o stałych NSText ...)…

#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

…możesz to zrobić:

label.textAlignment = kLabelAlignmentCenter;

I to:

label.lineBreakMode = kLabelTruncationMiddle;

Itp.

Ponieważ zmiany UIText / NSText prawdopodobnie pojawią się w przypadku wielu kontrolek, takie podejście jest całkiem przydatne.

(Zastrzeżenie: Będąc członkiem wyżej wymienionych miłośników stałej ziemi, przetestowałem to na starej wersji, ale jeszcze nie na iOS6.)

Wienke
źródło
Począwszy od Xcode 9 iOS 11.4 SDK, to wciąż jest dla mnie rozwiązanie. [labelOne setFont: [UIFont fontWithName: @ „HelveticaNeue” rozmiar: 20]]; labelOne.textAlignment = NSTextAlignmentLeft; // Wyjęte - kCTLeftTextAlignment; labelOne.text = dateStr; [headerView addSubview: labelOne];
Matthew Ferguson
19

NSTextAlignmentCentermoże być użyty zamiast, UITextAlignmentCentera lista innych zamienników znajduje się poniżej:

#ifdef __IPHONE_6_0 // iOS6 and later
#   define UITextAlignmentCenter    NSTextAlignmentCenter
#   define UITextAlignmentLeft      NSTextAlignmentLeft
#   define UITextAlignmentRight     NSTextAlignmentRight
#   define UILineBreakModeTailTruncation     NSLineBreakByTruncatingTail
#   define UILineBreakModeMiddleTruncation   NSLineBreakByTruncatingMiddle
#endif
nhisyam
źródło
1
To działa dla mnie. Testowane na symulatorze dla iOS 6.1 i 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];
neoneye
źródło
Lepszą konstrukcją byłoby użycie czegoś więcej: #ifdef (__IPHONE_OS_VERSION_MIN_REQUIRED> = __IPHONE_6_0) .... W przeciwnym razie otrzymasz UITextAlignmentCenter w iOS 7.
Ray Fix
13

Nie musisz tego robić. Xcode 4.5 skompiluje NSTextAlignmentCenteritp. W porządku w iOS 5.

Aaron Brager
źródło
1
To wydaje się być prawdą. Mam problem z UILineBreakMode i UITextAlignment - i zastąpienie ich NSLineBreakMode i NSTextAlignment - działa dobrze w Xcode 4.6.3 w symulatorze 5.0 i na iPadzie z systemem 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];
Gaurav Gilani
źródło
1
labelName.textAlignment=NSTextAlignmentLeft;
Mubin Shaikh
źródło
0

Miałem podobny problem i użyłem następującego: detailsLabel.textAlignment = NSTextAlignmentCenter;

BrainyMonkey
źródło
0

w iOS 6 lub nowszym

użyj tej wartości:

self.lbl_age.textAlignment=NSTextAlignmentCenter;

Hiren Dhamecha
źródło
0

Swift 3:

label.textAlignment = NSTextAlignment.center
Jerry Krinock
źródło