Вирівнювання мітки в iOS 6 - застаріле UITextAlignment


190

Здається, що UITextAlignmentCenterв iOS 6 застаріло.

Я все ще користуюся ним і добре працює, але це дає попередження.

Як я можу це виправити?

label.textAlignment = UITextAlignmentCenter;

Дякую.


7
Освічена здогадка : NSTextAlignment.
JustSid

1
Використовуйте замість NSTextAlignment.
Джайпракаш Дубей

Відповіді:


394

В iOS6 ви можете використовувати

label.textAlignment = NSTextAlignmentCenter;

Сподіваюся, це допомагає.


Можливо, що перерахунок МОЖЕ змінитись у якийсь час у майбутньому та спричинити несподівані результати. Це все. У цьому випадку немає сценарію досудового дня, але найкраща практика повинна переважати.
Бренден

17
majorl3oat: НЕ найкраща практика використовувати постійне число замість enum. Перелік допомагає читати код, що є надзвичайно важливим фактором. Що це може зламатись у майбутньому, це лише поганий дизайн від Apple, і якщо вони його порушать, я б скоріше мав помилки компіляції, ніж ризикувати, що вирівнювання вийде неправильним, не помічаючи мене.
Робін Андерссон

6
Робін ВІДПОВІДНО правильний. Без сумніву, використання найкращої практики enum IS. Ви ВЖЕ можете припустити, що NSTextAlignmentCenter означає ЦЕНТР, ви можете в жодному випадку не припустити, що 1 завжди означає ЦЕНТР. Якщо тільки Apple зовсім не спритна.
Расмус

enum спеціально, щоб код не зламався в майбутньому. Якщо вони вирішать, що 1 повинен бути 42, перерахунок продовжить працювати, твердо закодоване значення вийде з ладу.
Брайан Оуклі

Так, будь ласка, видаліть textAlignment = 1, це заплутає людей і поширить погані знання
MobileMon

45

Зміна labelAlignmentвластивостей, ймовірно, пов'язана з тим, що Apple ввела NSAttributedStrings до більшості елементів управління iOS, і тому потрібно змінити властивості UIText… на NSText….

Тож якщо ви оновили до iOS6, ви знаходитесь у конюшині; просто переключись UITextAlignmentCenterна NSTextAlignmentCenterта насолоджуйся новими модними струнами.

Але якщо ви працюєте зі складним проектом і хочете, щоб земля не рухалася так сильно під вашими ногами, можливо, ви хочете на деякий час дотримуватися старішої версії та адаптувати свій код для декількох версій:

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

Вищеописаний підхід працює для нових методів ; ви отримуєте попередження, але все працює нормально. Але коли компілятор бачить константу, про яку вона не знає, вона стає червоною і зупиняється на своїх слідах. Неможливо проскочити NSTextAlignmentCenterповз це. (Ну, може бути спосіб налаштувати поведінку компілятора тут, але це видається недоцільним.)

Вирішення завдання полягає в тому, щоб додати деякі умовні препроцесори. Якщо ви помістите щось подібне до файлу h вашого класу (або, можливо, у імпортований файл констант - який повинен сам включатись #import <UIKit/UIKit.h>, щоб коли-небудь дізнатися про 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

… Ви можете це зробити:

label.textAlignment = kLabelAlignmentCenter;

І це:

label.lineBreakMode = kLabelTruncationMiddle;

І т.д.

Оскільки ці зміни UIText / NSText, ймовірно, з'являться для кількох елементів керування, такий підхід є досить зручним.

(Caveat: Будучи членом вищезгаданих любителів стаціонарних земель, я перевірив це за допомогою старої версії, але ще не з iOS6.)


Що стосується Xcode 9 iOS 11.4 SDK, це все ще для мене рішення. [labelOne setFont: [UIFont fontWithName: @ "HelveticaNeue" розмір: 20]]; labelOne.textAlignment = NSTextAlignmentLeft; // Вийнято - kCTLeftTextAlignment; labelOne.text = dateStr; [headerView addSubview: labelOne];
Меттью Фергюсон

19

NSTextAlignmentCenterможна використовувати замість, UITextAlignmentCenterа список інших замін наведено нижче:

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

1
Це працює для мене. Тестовано на тренажері для iOS 6.1 та 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];

Кращою конструкцією було б використовувати щось подібне: #ifdef (__IPHONE_OS_VERSION_MIN_REQUIRED> = __IPHONE_6_0) .... Інакше ви отримаєте UITextAlignmentCenter в iOS 7.
Ray Fix

13

Вам не потрібно робити нічого з цього. Xcode 4.5 складе NSTextAlignmentCenterштраф і т.д. в iOS 5.


1
Це здається правдою. У мене є проблема з UILineBreakMode і UITextAlignment-- і заміна їх на NSLineBreakMode і NSTextAlignment - прекрасно працює в Xcode 4.6.3 в симуляторі 5.0 і на iPad під управлінням 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

У мене була подібна проблема, і я використав наступне: detailsLabel.textAlignment = NSTextAlignmentCenter;



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.