Label Alignment di iOS 6 - UITextAlignment sudah tidak digunakan lagi

190

Sepertinya UITextAlignmentCentersudah tidak digunakan lagi di iOS 6.

Saya masih menggunakannya dan berfungsi dengan baik, tetapi memberi peringatan.

Bagaimana saya bisa memperbaikinya?

label.textAlignment = UITextAlignmentCenter;

Terima kasih.

pengguna123
sumber
7
Tebakan: NSTextAlignment.
JustSid
1
Gunakan NSTextAlignment sebagai gantinya.
Jayprakash Dubey

Jawaban:

394

Di iOS6 Anda bisa menggunakan

label.textAlignment = NSTextAlignmentCenter;

Semoga ini membantu.

mainloat
sumber
Mungkin saja enum MUNGKIN berubah suatu saat di masa depan dan menyebabkan hasil yang tidak terduga. Itu saja. Tidak ada skenario kiamat dalam kasus ini, tetapi praktik yang lebih baik harus menang.
Brenden
17
majorl3oat: BUKAN praktik terbaik untuk menggunakan angka konstan alih-alih enum. Enum membantu keterbacaan kode yang merupakan faktor yang sangat penting. Mungkin rusak di masa depan hanya desain buruk dari Apple, dan jika mereka rusak saya lebih suka memiliki kesalahan kompilasi daripada mengambil risiko bahwa keberpihakan salah tanpa saya perhatikan.
Robin Andersson
6
Robin SEPENUHNYA benar. Menggunakan enum adalah praktik terbaik, tidak diragukan lagi. Anda SELALU dapat berasumsi bahwa NSTextAlignmentCenter berarti PUSAT, Anda TIDAK BISA menganggap bahwa 1 selalu berarti PUSAT. Kecuali Apple benar-benar gila.
Rasmus
enum khusus agar kode tidak rusak di masa depan. Jika mereka memutuskan bahwa angka 1 harus menjadi 42, enum akan terus bekerja, nilai hard-coded akan gagal.
Bryan Oakley
Ya tolong hapus textAlignment = 1, itu akan membingungkan orang dan menyebarkan pengetahuan buruk
MobileMon
45

Perubahan labelAlignmentproperti mungkin terkait dengan pengenalan NSAttributedStrings dari Apple ke lebih banyak kontrol iOS, dan oleh karena itu perlu mengubah properti UIText… menjadi NSText… properti.

Jadi, jika Anda meningkatkan ke iOS6, Anda sedang dalam semanggi; hanya beralih dari UITextAlignmentCenterke NSTextAlignmentCenterdan menikmati string baru yang mewah.

Tetapi jika Anda bekerja dengan proyek yang kompleks dan lebih suka bumi tidak terlalu bergerak, Anda mungkin ingin tetap menggunakan versi yang lebih lama untuk sementara waktu, dan mengadaptasi kode Anda untuk beberapa versi, seperti ini:

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

Pendekatan di atas bekerja untuk metode baru ; Anda mendapatkan peringatan tetapi semuanya berjalan dengan baik. Tetapi ketika kompiler melihat konstanta yang tidak diketahuinya, ia berubah merah dan berhenti di jalurnya. Tidak ada cara untuk menyelinap NSTextAlignmentCentermelewatinya. (Yah, mungkin ada cara untuk menyesuaikan perilaku kompiler di sini, tetapi tampaknya tidak disarankan.)

Solusinya adalah menambahkan beberapa definisi preprocessor bersyarat. Jika Anda meletakkan sesuatu seperti ini di file h kelas Anda (atau mungkin dalam file konstanta yang diimpor - yang harus dengan sendirinya disertakan #import <UIKit/UIKit.h>agar pernah tahu tentang NSText ... konstanta) ...

#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

…kamu bisa melakukan ini:

label.textAlignment = kLabelAlignmentCenter;

Dan ini:

label.lineBreakMode = kLabelTruncationMiddle;

Dll

Karena perubahan UIText / NSText ini cenderung muncul untuk beberapa kontrol, pendekatan ini cukup berguna.

(Peringatan: Menjadi anggota pecinta mapan di bumi yang disebutkan di atas, saya telah menguji ini dengan versi lama, tetapi belum dengan iOS6.)

Wienke
sumber
Pada Xcode 9 iOS 11.4 SDK, ini masih merupakan solusi bagi saya. [labelOne setFont: [UIFont fontWithName: @ "HelveticaNeue" size: 20]]; labelOne.textAlignment = NSTextAlignmentLeft; // Diambil - kCTLeftTextAlignment; labelOne.text = dateStr; [headerView addSubview: labelOne];
Matius Ferguson
19

NSTextAlignmentCenterdapat digunakan di tempat UITextAlignmentCenterdan daftar penggantian lainnya di bawah ini:

#ifdef __IPHONE_6_0 // iOS6 and later
#   define UITextAlignmentCenter    NSTextAlignmentCenter
#   define UITextAlignmentLeft      NSTextAlignmentLeft
#   define UITextAlignmentRight     NSTextAlignmentRight
#   define UILineBreakModeTailTruncation     NSLineBreakByTruncatingTail
#   define UILineBreakModeMiddleTruncation   NSLineBreakByTruncatingMiddle
#endif
nhisyam
sumber
1
Ini bekerja untuk saya. Diuji pada simulator untuk iOS 6.1 dan 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
sumber
Konstruksi yang lebih baik adalah dengan menggunakan sesuatu yang lebih seperti: #ifdef (__IPHONE_OS_VERSION_MIN_REQUIRED> = __IPHONE_6_0) .... Jika tidak, Anda akan mendapatkan UITextAlignmentCenter di iOS 7.
Ray Fix
13

Anda tidak harus melakukan keduanya. Xcode 4.5 akan mengkompilasi NSTextAlignmentCenter, dll denda di iOS 5.

Aaron Brager
sumber
1
Ini sepertinya benar. Saya memiliki masalah dengan UILineBreakMode dan UITextAlignment - dan menggantinya dengan NSLineBreakMode dan NSTextAlignment - berfungsi dengan baik dalam Xcode 4.6.3 di simulator 5.0 dan pada iPad yang menjalankan 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
sumber
1
labelName.textAlignment=NSTextAlignmentLeft;
Mubin Shaikh
sumber
0

Saya memiliki masalah serupa dan menggunakan yang berikut ini: detailsLabel.textAlignment = NSTextAlignmentCenter;

BrainyMonkey
sumber
0

di iOS 6 atau lebih tinggi

gunakan nilai ini:

self.lbl_age.textAlignment=NSTextAlignmentCenter;

Hiren Dhamecha
sumber
0

Swift 3:

label.textAlignment = NSTextAlignment.center
Jerry Krinock
sumber