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.


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.


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.)


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

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];

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.


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];


0

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


0

in iOS 6 oder höher

Verwenden Sie diesen Wert:

self.lbl_age.textAlignment=NSTextAlignmentCenter;


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.