Выравнивание меток в iOS 6 - UITextAlignment устарела


190

Похоже, UITextAlignmentCenterне рекомендуется в iOS 6.

Я все еще использую это и работает хорошо, но это дает предупреждение.

Как я могу это исправить?

label.textAlignment = UITextAlignmentCenter;

Спасибо.


7
Образованное предположение NSTextAlignment.
JustSid

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

Ответы:


394

В iOS6 вы можете использовать

label.textAlignment = NSTextAlignmentCenter;

Надеюсь это поможет.


Возможно, что enum МОЖЕТ измениться в будущем и привести к неожиданным результатам. Вот и все. В этом случае сценария конца света нет, но лучшие практики должны преобладать.
Бренден

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

6
Робин полностью прав. Несомненно, использование enum - это лучшая практика. Вы можете ВСЕГДА предполагать, что NSTextAlignmentCenter означает CENTER, вы НИКОГДА НЕ можете предположить, что 1 всегда означает CENTER. Если только Apple не совсем придурок.
Расмус

перечисление определенно так, чтобы код не сломался в будущем. Если они решат, что 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, вероятно, будут появляться для нескольких элементов управления, этот подход весьма удобен.

(Предостережение: будучи членом вышеупомянутых любителей устойчивой земли, я проверил это со старой версией, но еще не с iOS6.)


Начиная с Xcode 9 iOS 11.4 SDK, это все еще решение для меня. [labelOne setFont: [UIFont fontWithName: @ "HelveticaNeue" size: 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.