Alinhamento de etiqueta no iOS 6 - UITextAlignment descontinuado

190

Parece que UITextAlignmentCenterfoi descontinuado no iOS 6.

Ainda o uso e funciona bem, mas dá um aviso.

Como posso consertar isso?

label.textAlignment = UITextAlignmentCenter;

Obrigado.

user123
fonte
7
Palpite: NSTextAlignment.
JustSid
1
Use NSTextAlignment.
Jayprakash Dubey

Respostas:

394

No iOS6 você pode usar

label.textAlignment = NSTextAlignmentCenter;

Espero que isto ajude.

majorl3oat
fonte
É possível que o enum PODE mudar em algum momento no futuro e causar resultados inesperados. Isso é tudo. Não há cenário apocalíptico nesse caso, mas as melhores práticas devem prevalecer.
Brenden
17
majorl3oat: NÃO é uma prática recomendada usar um número constante em vez de enum. A enumeração ajuda na legibilidade do código, que é um fator extremamente importante. Que ele possa quebrar no futuro é apenas um projeto ruim da Apple, e se eles o quebrarem, prefiro ter erros de compilação do que arriscar que o alinhamento fique errado sem que eu perceba.
226126 Robin Andersson
6
Robin está completamente correto. Usar uma enum é a melhor prática, sem dúvida. SEMPRE você pode supor que NSTextAlignmentCenter significa CENTER, de forma alguma pode assumir que 1 sempre significa CENTER. A menos que a Apple seja completamente idiota.
Rasmus
uma enumeração é especificamente para que o código não seja quebrado no futuro. Se eles decidirem que o 1 deve ser um 42, a enumeração continuará funcionando, o valor codificado falhará.
Bryan Oakley
Sim, por favor remover o TextAlignment = 1, ele irá confundir as pessoas e se espalhou mau conhecimento
MobileMon
45

A labelAlignmentalteração de propriedade provavelmente está relacionada à introdução de NSAttributedStrings da Apple em mais controles do iOS e, portanto, é necessário alterar as propriedades UIText… para NSText….

Então, se você atualizou para o iOS6, está no trevo; basta mudar a partir UITextAlignmentCenterde NSTextAlignmentCentere desfrutar das extravagantes novas cordas.

Mas se você estiver trabalhando com um projeto complexo e preferir que a Terra não se mova tanto sob seus pés, convém ficar com uma versão mais antiga por um tempo e adaptar seu código para várias versões, algo como isto:

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

A abordagem acima funciona para novos métodos ; você recebe avisos, mas tudo corre bem. Mas quando o compilador vê uma constante que não conhece, fica vermelho e para em suas trilhas. Não há como passar despercebido NSTextAlignmentCenter. (Bem, pode haver uma maneira de personalizar o comportamento do compilador aqui, mas parece desaconselhável.)

A solução alternativa é adicionar algumas definições condicionais do pré-processador. Se você colocar algo parecido com isso no arquivo h da sua classe (ou talvez em um arquivo constante importado - que deve ser incluído #import <UIKit/UIKit.h>para que você possa conhecer as constantes 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

…você consegue fazer isso:

label.textAlignment = kLabelAlignmentCenter;

E isto:

label.lineBreakMode = kLabelTruncationMiddle;

Etc.

Como é provável que essas alterações no UIText / NSText estejam surgindo para vários controles, essa abordagem é bastante útil.

(Advertência: como membro dos amantes da terra firme acima mencionados, testei isso com uma versão antiga, mas ainda não com o iOS6.)

Wienke
fonte
No Xcode 9 iOS 11.4 SDK, essa ainda é a solução para mim. [labelOne setFont: [UIFont fontWithName: @ "HelveticaNeue" tamanho: 20]]; labelOne.textAlignment = NSTextAlignmentLeft; // Retirado - kCTLeftTextAlignment; labelOne.text = dateStr; [headerView addSubview: labelOne];
Matthew Ferguson
19

NSTextAlignmentCenterpode ser usado no lugar de UITextAlignmentCentere uma lista de outras substituições está abaixo:

#ifdef __IPHONE_6_0 // iOS6 and later
#   define UITextAlignmentCenter    NSTextAlignmentCenter
#   define UITextAlignmentLeft      NSTextAlignmentLeft
#   define UITextAlignmentRight     NSTextAlignmentRight
#   define UILineBreakModeTailTruncation     NSLineBreakByTruncatingTail
#   define UILineBreakModeMiddleTruncation   NSLineBreakByTruncatingMiddle
#endif
nhisyam
fonte
1
Isso funciona para mim. Testado no simulador para 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];
neoneye
fonte
Uma construção melhor seria usar algo mais como: #ifdef (__IPHONE_OS_VERSION_MIN_REQUIRED> = __IPHONE_6_0) .... Caso contrário, você obterá o UITextAlignmentCenter no iOS 7.
Ray Fix
13

Você não precisa fazer nada disso. O Xcode 4.5 compilará o NSTextAlignmentCenter, etc. excelente no iOS 5.

Aaron Brager
fonte
1
Isto parece ser verdade. Eu tenho o problema com UILineBreakMode e UITextAlignment - e substituí-los por NSLineBreakMode e NSTextAlignment-- funciona bem no Xcode 4.6.3 no simulador 5.0 e em um iPad executando 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
fonte
1
labelName.textAlignment=NSTextAlignmentLeft;
Mubin Shaikh
fonte
0

Eu tive um problema semelhante e usei o seguinte: detailsLabel.textAlignment = NSTextAlignmentCenter;

BrainyMonkey
fonte
0

no iOS 6 ou superior

use este valor:

self.lbl_age.textAlignment=NSTextAlignmentCenter;

Hiren Dhamecha
fonte
0

Swift 3:

label.textAlignment = NSTextAlignment.center
Jerry Krinock
fonte