193 votes

Alignement des étiquettes dans iOS 6 - UITextAlignment déprécié

On dirait que UITextAlignmentCenter est déprécié dans iOS 6.

Je l'utilise toujours et il fonctionne bien, mais il donne un avertissement.

Comment puis-je réparer cela ?

label.textAlignment = UITextAlignmentCenter;

Merci.

7 votes

Une supposition éclairée : NSTextAlignment .

1 votes

Utilisez NSTextAlignment à la place.

399voto

majorl3oat Points 2956

Dans iOS6, vous pouvez utiliser

label.textAlignment = NSTextAlignmentCenter;

0 votes

Il est possible que l'enum puisse changer à un moment donné dans le futur et provoquer des résultats inattendus. C'est tout. Pas de scénario catastrophe dans ce cas, mais de meilleures pratiques devraient prévaloir.

17 votes

Majorl3oat : Ce n'est PAS une bonne pratique d'utiliser un nombre constant au lieu d'un enum. L'enum aide à la lisibilité du code, ce qui est un facteur extrêmement important. Le fait qu'il puisse être cassé à l'avenir n'est qu'une mauvaise conception de la part d'Apple, et s'ils le cassent, je préfère avoir des erreurs de compilation plutôt que de risquer que l'alignement soit mauvais sans que je m'en aperçoive.

6 votes

Robin a tout à fait raison. L'utilisation d'un enum est la meilleure pratique, sans aucun doute. Vous pouvez TOUJOURS supposer que NSTextAlignmentCenter signifie CENTER, vous ne pouvez en AUCUN cas supposer que 1 signifie toujours CENTER. À moins qu'Apple ne soit complètement fou.

44voto

Wienke Points 2682

El labelAlignment est probablement lié à l'introduction par Apple de NSAttributedStrings dans un plus grand nombre de contrôles iOS, et donc à la nécessité de remplacer les propriétés UIText par des propriétés NSText .

Donc, si vous avez mis à jour vers iOS6, vous êtes dans la trèfle ; il suffit de passer de UITextAlignmentCenter a NSTextAlignmentCenter et profiter des nouvelles cordes fantaisie.

Mais si vous travaillez sur un projet complexe et que vous préférez que la terre ne bouge pas tant que ça sous vos pieds, il est préférable de s'en tenir à une version plus ancienne pendant un certain temps et d'adapter votre code à plusieurs versions, comme ceci :

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

L'approche ci-dessus fonctionne pour les nouvelles méthodes ; vous obtenez des avertissements mais tout fonctionne bien. Mais quand le compilateur voit un constant qu'il ne connaît pas, il devient rouge et s'arrête dans sa course. Il n'y a aucun moyen de se faufiler NSTextAlignmentCenter le dépasser. (Il pourrait y avoir un moyen de personnaliser le comportement du compilateur ici, mais cela semble déconseillé).

La solution consiste à ajouter des définitions conditionnelles dans le préprocesseur. Si vous mettez quelque chose comme ceci dans le fichier h de votre classe (ou peut-être dans un fichier de constantes importé -- qui doit lui-même inclure #import <UIKit/UIKit.h> pour pouvoir connaître les 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

vous pouvez le faire :

label.textAlignment = kLabelAlignmentCenter;

Et ceci :

label.lineBreakMode = kLabelTruncationMiddle;

Etc.

Comme ces modifications UIText/NSText sont susceptibles d'apparaître pour plusieurs contrôles, cette approche est très pratique.

(Mise en garde : faisant partie des amoureux de la terre ferme mentionnés plus haut, j'ai testé ceci avec une ancienne version, mais pas encore avec iOS6).

0 votes

A partir de Xcode 9 iOS 11.4 SDK , c'est toujours la solution pour moi. [labelOne setFont :[UIFont fontWithName:@"HelveticaNeue" size:20]] ; labelOne.textAlignment = NSTextAlignmentLeft ; //Taken out - kCTLeftTextAlignment ; labelOne.text = dateStr ; [headerView addSubview:labelOne] ;

19voto

nhisyam Points 559

NSTextAlignmentCenter peut être utilisé à la place de UITextAlignmentCenter et une liste d'autres remplacements est ci-dessous :

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

1 votes

Cela fonctionne pour moi. Testé sur le simulateur pour iOS 6.1 et iOS 5.0.

15voto

neoneye Points 11545
#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];

0 votes

Une meilleure construction serait d'utiliser quelque chose comme : #ifdef (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_6_0) .... Sinon, vous allez obtenir UITextAlignmentCenter dans iOS 7.

13voto

Aaron Brager Points 16394

Vous n'êtes pas obligé de faire l'un ou l'autre. Xcode 4.5 compilera le fichier NSTextAlignmentCenter etc. fonctionnent bien dans iOS 5.

1 votes

Cela semble être vrai. J'ai le problème avec UILineBreakMode et UITextAlignment-- et les remplacer par NSLineBreakMode et NSTextAlignment-- fonctionne bien dans Xcode 4.6.3 dans le simulateur 5.0 et sur un iPad exécutant 5.-.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X