Etikettenausrichtung in iOS 6 - UITextAlignment veraltet

190

Sieht aus als ob UITextAlignmentCenter in iOS 6 veraltet zu sein.

Ich benutze es immer noch und funktioniert gut, aber es gibt eine Warnung.

Wie kann ich das beheben?

label.textAlignment = UITextAlignmentCenter;

Vielen Dank.

user123
quelle
7
Gebildete Vermutung : NSTextAlignment.
JustSid
1
Verwenden Sie stattdessen NSTextAlignment.
Jayprakash Dubey

Antworten:

394

In iOS6 können Sie verwenden

label.textAlignment = NSTextAlignmentCenter;

Hoffe das hilft.

majorl3oat
quelle
Es ist möglich, dass sich die Aufzählung irgendwann in der Zukunft ändert und unerwartete Ergebnisse verursacht. Das ist alles. In diesem Fall kein Weltuntergangsszenario, aber bessere Praktiken sollten sich durchsetzen.
Brenden
17
majorl3oat: Es wird NICHT empfohlen, anstelle von enum eine konstante Zahl zu verwenden. Die Aufzählung hilft bei der Lesbarkeit des Codes, was ein äußerst wichtiger Faktor ist. Dass es in Zukunft kaputt gehen könnte, ist nur ein schlechtes Design von Apple, und wenn sie es kaputt machen, hätte ich lieber Kompilierungsfehler als das Risiko, dass die Ausrichtung falsch wird, ohne dass ich es merke.
Robin Andersson
6
Robin ist völlig korrekt. Die Verwendung einer Aufzählung ist zweifellos eine bewährte Methode. Sie können IMMER davon ausgehen, dass NSTextAlignmentCenter CENTER bedeutet. Sie können auf keinen Fall davon ausgehen, dass 1 immer CENTER bedeutet. Es sei denn, Apple ist völlig dumm.
Rasmus
Eine Aufzählung dient speziell dazu, dass der Code in Zukunft nicht beschädigt wird. Wenn sie entscheiden, dass die 1 eine 42 sein soll, funktioniert die Aufzählung weiter, der fest codierte Wert schlägt fehl.
Bryan Oakley
Ja, bitte entfernen Sie den TextAlignment = 1, es wird die Leute verwirren und schlechtes Wissen verbreiten
MobileMon
45

Die labelAlignmentEigenschaftsänderung hängt wahrscheinlich damit zusammen, dass Apple NSAttributedStrings in mehr iOS-Steuerelementen einführt und daher die UIText… -Eigenschaften in NSText… -Eigenschaften ändern muss.

Wenn Sie also auf iOS6 aktualisiert haben, sind Sie in Klee; Wechseln Sie einfach von UITextAlignmentCenterzu NSTextAlignmentCenterund genießen Sie die schicken neuen Saiten.

Wenn Sie jedoch mit einem komplexen Projekt arbeiten und es vorziehen, dass sich die Erde nicht so stark unter Ihren Füßen bewegt, möchten Sie möglicherweise eine Weile bei einer älteren Version bleiben und Ihren Code für mehrere Versionen anpassen.

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

Der obige Ansatz funktioniert für neue Methoden ; Sie erhalten Warnungen, aber alles läuft gut. Wenn der Compiler jedoch eine Konstante sieht , von der er nichts weiß, wird er rot und bleibt in seinen Spuren stehen. Es gibt keine Möglichkeit, sich daran NSTextAlignmentCentervorbei zu schleichen . (Nun, es könnte eine Möglichkeit geben, das Verhalten des Compilers hier anzupassen, aber es scheint nicht ratsam.)

Die Problemumgehung besteht darin, einige bedingte Präprozessordefinitionen hinzuzufügen. Wenn Sie so etwas in die h-Datei Ihrer Klasse #import <UIKit/UIKit.h>einfügen (oder vielleicht in eine importierte Konstantendatei - die selbst enthalten muss, um jemals etwas über die NSText ... -Konstanten zu erfahren)…

#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

…du kannst das:

label.textAlignment = kLabelAlignmentCenter;

Und das:

label.lineBreakMode = kLabelTruncationMiddle;

Etc.

Da diese UIText / NSText-Änderungen wahrscheinlich für mehrere Steuerelemente auftreten, ist dieser Ansatz recht praktisch.

(Vorsichtsmaßnahme: Als Mitglied der oben genannten Liebhaber von Steady Earth habe ich dies mit einer alten Version getestet, aber noch nicht mit iOS6.)

Wienke
quelle
Ab Xcode 9 iOS 11.4 SDK ist dies immer noch die Lösung für mich. [labelOne setFont: [UIFont fontWithName: @ "HelveticaNeue" Größe: 20]]; labelOne.textAlignment = NSTextAlignmentLeft; // Herausgenommen - kCTLeftTextAlignment; labelOne.text = dateStr; [headerView addSubview: labelOne];
Matthew Ferguson
19

NSTextAlignmentCenterkann anstelle von verwendet werden UITextAlignmentCenterund eine Liste anderer Ersetzungen ist unten:

#ifdef __IPHONE_6_0 // iOS6 and later
#   define UITextAlignmentCenter    NSTextAlignmentCenter
#   define UITextAlignmentLeft      NSTextAlignmentLeft
#   define UITextAlignmentRight     NSTextAlignmentRight
#   define UILineBreakModeTailTruncation     NSLineBreakByTruncatingTail
#   define UILineBreakModeMiddleTruncation   NSLineBreakByTruncatingMiddle
#endif
nhisyam
quelle
1
Das funktioniert bei mir. Getestet auf dem Simulator für iOS 6.1 und 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
quelle
Eine bessere Konstruktion wäre, etwas mehr zu verwenden wie: #ifdef (__IPHONE_OS_VERSION_MIN_REQUIRED> = __IPHONE_6_0) .... Andernfalls erhalten Sie UITextAlignmentCenter in iOS 7.
Ray Fix
13

Sie müssen beides nicht tun. Xcode 4.5 kompiliert das NSTextAlignmentCenterusw. in iOS 5.

Aaron Brager
quelle
1
Dies scheint wahr zu sein. Ich habe das Problem mit UILineBreakMode und UITextAlignment - und das Ersetzen durch NSLineBreakMode und NSTextAlignment - funktioniert in Xcode 4.6.3 im 5.0-Simulator und auf einem iPad mit 5.- einwandfrei.
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
quelle
1
labelName.textAlignment=NSTextAlignmentLeft;
Mubin Shaikh
quelle
0

Ich hatte ein ähnliches Problem und verwendete Folgendes: detailsLabel.textAlignment = NSTextAlignmentCenter;

BrainyMonkey
quelle
0

in iOS 6 oder höher

Verwenden Sie diesen Wert:

self.lbl_age.textAlignment=NSTextAlignmentCenter;

Hiren Dhamecha
quelle
0

Swift 3:

label.textAlignment = NSTextAlignment.center
Jerry Krinock
quelle