Alineación de etiquetas en iOS 6 - UITextAlignment en desuso


190

Parece que UITextAlignmentCenterestá en desuso en iOS 6.

Todavía lo uso y funciona bien, pero me da una advertencia.

¿Cómo puedo arreglar esto?

label.textAlignment = UITextAlignmentCenter;

Gracias.


77
Conjetura: NSTextAlignment.
JustSid

1
Utilice NSTextAlignment en su lugar.
Jayprakash Dubey

Respuestas:


394

En iOS6 puedes usar

label.textAlignment = NSTextAlignmentCenter;

Espero que esto ayude.


Es posible que la enumeración PUEDE cambiar en algún momento en el futuro y causar resultados inesperados. Eso es todo. No hay escenario del fin del mundo en este caso, pero las mejores prácticas deben prevalecer.
Brenden

17
majorl3oat: NO es una buena práctica usar un número constante en lugar de enum. La enumeración ayuda con la legibilidad del código, que es un factor extremadamente importante. Que podría romperse en el futuro es solo un mal diseño de Apple, y si lo rompen, preferiría tener errores de compilación que arriesgarme a que la alineación se equivoque sin que me dé cuenta.
Robin Andersson el

66
Robin es COMPLETAMENTE correcto. Usar una enumeración ES la mejor práctica, sin duda. SIEMPRE puede suponer que NSTextAlignmentCenter significa CENTRO, de ninguna manera puede suponer que 1 siempre significa CENTRO. A menos que Apple sea completamente tonto.
Rasmus

una enumeración es específicamente para que el código no se rompa en el futuro. Si deciden que el 1 debe ser un 42, la enumeración seguirá funcionando, el valor codificado fallará.
Bryan Oakley

Sí, elimine textAlignment = 1, confundirá a las personas y difundirá malos conocimientos
MobileMon

45

los labelAlignment cambio de propiedad probablemente esté relacionado con la introducción de NSAttributedStrings de Apple a más controles de iOS y, por lo tanto, la necesidad de cambiar las propiedades UIText ... a propiedades NSText ...

Entonces, si has actualizado a iOS6, estás en trébol; solo cambia de UITextAlignmentCenteraNSTextAlignmentCenter y disfrutar de las cadenas de lujo nuevos.

Pero si está trabajando con un proyecto complejo y prefiere que la tierra no se mueva tanto bajo sus pies, es posible que desee quedarse con una versión anterior por un tiempo y adaptar su código para múltiples versiones, algo como esto:

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

El enfoque anterior funciona para nuevos métodos ; obtienes advertencias pero todo funciona bien. Pero cuando el compilador ve una constante que no conoce, se vuelve roja y se detiene en seco. No hay forma de escabullirse NSTextAlignmentCenter. (Bueno, puede haber una forma de personalizar el comportamiento del compilador aquí, pero parece desaconsejable).

La solución es agregar algunas definiciones de preprocesador condicional. Si coloca algo como esto en el archivo h de su clase (o tal vez en un archivo de constantes importado, que debe incluirse #import <UIKit/UIKit.h>para saber sobre las 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

…Puedes hacerlo:

label.textAlignment = kLabelAlignmentCenter;

Y esto:

label.lineBreakMode = kLabelTruncationMiddle;

Etc.

Dado que es probable que estos cambios de UIText / NSText estén apareciendo para múltiples controles, este enfoque es bastante útil.

(Advertencia: al ser miembro de los amantes de la tierra estable antes mencionados, he probado esto con una versión antigua, pero aún no con iOS6).


A partir de Xcode 9 iOS 11.4 SDK, esta sigue siendo la solución para mí. [labelOne setFont: [UIFont fontWithName: @ "HelveticaNeue" tamaño: 20]]; labelOne.textAlignment = NSTextAlignmentLeft; // Tomado - kCTLeftTextAlignment; labelOne.text = dateStr; [headerView addSubview: labelOne];
Matthew Ferguson

19

NSTextAlignmentCenterse puede usar en lugar de UITextAlignmentCenteruna lista de otros reemplazos a continuación:

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

1
Esto funciona para mi. Probado en el simulador para iOS 6.1 y 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 mejor construcción sería usar algo más como: #ifdef (__IPHONE_OS_VERSION_MIN_REQUIRED> = __IPHONE_6_0) .... De lo contrario, obtendrá UITextAlignmentCenter en iOS 7.
Ray Fix

13

No tienes que hacer ninguno de estos. Xcode 4.5 compilará el NSTextAlignmentCenter, etc. bien en iOS 5.


1
Esto parece ser cierto. Tengo el problema con UILineBreakMode y UITextAlignment, y reemplazarlos con NSLineBreakMode y NSTextAlignment, funciona bien en Xcode 4.6.3 en el simulador 5.0 y en un iPad con 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

Tuve un problema similar y utilicé lo siguiente: detailsLabel.textAlignment = NSTextAlignmentCenter;


0

en iOS 6 o superior

usa este valor:

self.lbl_age.textAlignment=NSTextAlignmentCenter;


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.