Alignement des étiquettes dans iOS 6 - UITextAlignment obsolète

190

On dirait que UITextAlignmentCenterc'est obsolète dans iOS 6.

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

Comment puis-je réparer cela?

label.textAlignment = UITextAlignmentCenter;

Merci.

user123
la source
7
Supposition: NSTextAlignment.
JustSid
1
Utilisez plutôt NSTextAlignment.
Jayprakash Dubey

Réponses:

394

Dans iOS6, vous pouvez utiliser

label.textAlignment = NSTextAlignmentCenter;

J'espère que cela t'aides.

majorl3oat
la source
Il est possible que l'énumération PEUT changer à un moment donné dans le futur et provoquer des résultats inattendus. C'est tout. Pas de scénario apocalyptique dans ce cas, mais de meilleures pratiques devraient prévaloir.
Brenden
17
majorl3oat: Il n'est PAS recommandé d'utiliser un nombre constant au lieu d'énumération. L'énumération contribue à la lisibilité du code, ce qui est un facteur extrêmement important. Qu'il puisse se casser à l'avenir est juste une mauvaise conception d'Apple, et s'ils le cassent, je préférerais avoir des erreurs de compilation que de risquer que l'alignement se trompe sans que je m'en aperçoive.
Robin Andersson
6
Robin a TOTALEMENT raison. L'utilisation d'une énumération est la meilleure pratique, sans aucun doute. Vous pouvez TOUJOURS supposer que NSTextAlignmentCenter signifie CENTRE, vous ne pouvez en aucun cas supposer que 1 signifie toujours CENTRE. À moins qu'Apple ne soit complètement idiot.
Rasmus
une énumération est spécifiquement pour que le code ne se casse pas à l'avenir. S'ils décident que le 1 doit être un 42, l'énumération continuera à fonctionner, la valeur codée en dur échouera.
Bryan Oakley
Oui s'il vous plaît supprimer le textAlignment = 1, cela déroutera les gens et répandra de mauvaises connaissances
MobileMon
45

Le labelAlignmentchangement de propriété est probablement lié à l'introduction par Apple de NSAttributedStrings à plus de contrôles iOS, et donc à la nécessité de changer les propriétés UIText… en propriétés NSText….

Donc, si vous êtes passé à iOS6, vous êtes dans le trèfle; il suffit de passer de UITextAlignmentCenterà NSTextAlignmentCenteret de profiter des nouvelles cordes fantaisie.

Mais si vous travaillez avec un projet complexe et que vous préférez que la terre ne bouge pas autant sous vos pieds, vous voudrez peut-être vous en tenir à une version plus ancienne pendant un certain temps et adapter votre code pour plusieurs versions, quelque chose comme ceci:

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

L'approche ci-dessus fonctionne pour de nouvelles méthodes ; vous recevez des avertissements mais tout fonctionne bien. Mais lorsque le compilateur voit une constante qu'il ne connaît pas, il devient rouge et s'arrête sur ses traces. Il n'y a aucun moyen de se faufiler NSTextAlignmentCenter. (Eh bien, il pourrait y avoir un moyen de personnaliser le comportement du compilateur ici, mais cela semble déconseillé.)

La solution de contournement consiste à ajouter des définitions de préprocesseur conditionnelles. Si vous mettez quelque chose comme ça 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>afin de toujours 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

…tu peux le faire:

label.textAlignment = kLabelAlignmentCenter;

Et ça:

label.lineBreakMode = kLabelTruncationMiddle;

Etc.

Étant donné que ces modifications UIText / NSText sont susceptibles d'apparaître pour plusieurs contrôles, cette approche est assez pratique.

(Mise en garde: étant membre des amoureux de la terre stable susmentionnés, j'ai testé cela avec une ancienne version, mais pas encore avec iOS6.)

Wienke
la source
À partir du SDK Xcode 9 iOS 11.4, c'est toujours la solution pour moi. [labelOne setFont: [UIFont fontWithName: @ "HelveticaNeue" taille: 20]]; labelOne.textAlignment = NSTextAlignmentLeft; // Retiré - kCTLeftTextAlignment; labelOne.text = dateStr; [headerView addSubview: labelOne];
Matthew Ferguson
19

NSTextAlignmentCenterpeut être utilisé à la place de UITextAlignmentCenteret 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
nhisyam
la source
1
Cela fonctionne pour moi. Testé sur le simulateur pour iOS 6.1 et 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
la source
Une meilleure construction serait d'utiliser quelque chose de plus comme: #ifdef (__IPHONE_OS_VERSION_MIN_REQUIRED> = __IPHONE_6_0) .... Sinon, vous allez obtenir UITextAlignmentCenter sous iOS 7.
Ray Fix
13

Vous n'avez à faire ni l'un ni l'autre. Xcode 4.5 compilera le NSTextAlignmentCenter, etc. bien dans iOS 5.

Aaron Brager
la source
1
Cela semble être vrai. J'ai le problème avec UILineBreakMode et UITextAlignment - et en les remplaçant par NSLineBreakMode et NSTextAlignment - fonctionne bien dans Xcode 4.6.3 dans le simulateur 5.0 et sur un iPad exécutant 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
la source
1
labelName.textAlignment=NSTextAlignmentLeft;
Mubin Shaikh
la source
0

J'ai eu un problème similaire et j'ai utilisé ce qui suit: detailsLabel.textAlignment = NSTextAlignmentCenter;

BrainyMonkey
la source
0

dans iOS 6 ou supérieur

utilisez cette valeur:

self.lbl_age.textAlignment=NSTextAlignmentCenter;

Hiren Dhamecha
la source
0

Swift 3:

label.textAlignment = NSTextAlignment.center
Jerry Krinock
la source
0

Pour Swift 5+, utilisez:

yourLabel.textAlignment = .center

où vous pouvez définir:

public enum NSTextAlignment : Int {
    case left = 0 // Visually left aligned
    case center = 1 // Visually centered
    case right = 2 // Visually right aligned
    case justified = 3 // Fully-justified. The last line in a paragraph is natural-aligned.
    case natural = 4 // Indicates the default alignment for script 
}
Kstin
la source