Sắp xếp nhãn trong iOS 6 - Không chấp nhận UITextAlocate


190

Có vẻ như UITextAlignmentCenterkhông được dùng trong iOS 6.

Tôi vẫn sử dụng nó và hoạt động tốt, nhưng nó đưa ra một cảnh báo.

Làm thế nào tôi có thể sửa lỗi này?

label.textAlignment = UITextAlignmentCenter;

Cảm ơn.


7
Đoán giáo dục : NSTextAlignment.
JustSid

1
Sử dụng NSTextAlocation thay thế.
Jayprakash Dubey

Câu trả lời:


394

Trong iOS6, bạn có thể sử dụng

label.textAlignment = NSTextAlignmentCenter;

Hi vọng điêu nay co ich.


Có thể enum CÓ THỂ thay đổi vào một lúc nào đó trong tương lai và gây ra kết quả không mong muốn. Đó là tất cả. Không có kịch bản ngày tận thế trong trường hợp này, nhưng thực hành tốt hơn nên thắng thế.
Brenden

17
Majorl3oat: KHÔNG nên sử dụng số không đổi thay vì enum. Enum giúp với khả năng đọc mã là một yếu tố cực kỳ quan trọng. Rằng nó có thể bị hỏng trong tương lai chỉ là thiết kế tồi từ Apple, và nếu chúng phá vỡ nó, tôi thà mắc lỗi biên dịch hơn là mạo hiểm rằng việc căn chỉnh bị sai mà tôi không nhận ra.
Robin Andersson

6
Robin là HOÀN TOÀN chính xác. Sử dụng một enum IS thực hành tốt nhất, không có nghi ngờ. Bạn có thể LUÔN giả định rằng NSTextAlocateCenter có nghĩa là TRUNG TÂM, bạn KHÔNG THỂ giả sử rằng 1 luôn có nghĩa là TRUNG TÂM. Trừ khi Apple hoàn toàn ngu ngốc.
Rasmus

một enum đặc biệt để mã không bị phá vỡ trong tương lai. Nếu họ quyết định rằng 1 nên là 42, enum sẽ tiếp tục hoạt động, giá trị mã hóa cứng sẽ thất bại.
Bryan Oakley

Có, vui lòng xóa textAlocation = 1, nó sẽ gây nhầm lẫn cho mọi người và truyền bá kiến ​​thức xấu
MobileMon

45

Các labelAlignmentthay đổi sở hữu có lẽ liên quan đến NSAttributedStrings giới thiệu của Apple để thêm các điều khiển iOS, và do đó cần phải thay đổi UIText ... tính để NSText ... tài sản.

Vì vậy, nếu bạn đã nâng cấp lên iOS6, bạn đang ở trong cỏ ba lá; chỉ cần chuyển từ UITextAlignmentCentersang NSTextAlignmentCentervà tận hưởng các chuỗi mới lạ mắt.

Nhưng nếu bạn đang làm việc với một dự án phức tạp và muốn trái đất không di chuyển quá nhiều dưới chân bạn, bạn có thể muốn gắn bó với một phiên bản cũ hơn trong một thời gian và điều chỉnh mã của bạn cho nhiều phiên bản, như thế này:

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

Cách tiếp cận trên hoạt động cho các phương pháp mới ; bạn nhận được cảnh báo nhưng mọi thứ đều chạy tốt Nhưng khi trình biên dịch nhìn thấy một hằng số mà nó không biết, nó sẽ chuyển sang màu đỏ và dừng lại trong các rãnh của nó. Không có cách nào để lén NSTextAlignmentCenterqua nó. (Chà, có thể có một cách để tùy chỉnh hành vi của người biên dịch ở đây, nhưng dường như không thể xem được.)

Cách giải quyết là thêm một số định nghĩa tiền xử lý có điều kiện. Nếu bạn đặt một cái gì đó như thế này trong tệp h của lớp bạn (hoặc có lẽ trong tệp hằng được nhập - phải bao gồm #import <UIKit/UIKit.h>để biết về NSText ... hằng số)

#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

…bạn có thể làm được việc này:

label.textAlignment = kLabelAlignmentCenter;

Và điều này:

label.lineBreakMode = kLabelTruncationMiddle;

Vân vân.

Vì những thay đổi UIText / NSText này có thể sẽ xuất hiện cho nhiều điều khiển, nên cách tiếp cận này khá tiện dụng.

(Hãy cẩn thận: Là một thành viên của những người yêu thích trái đất ổn định đã nói ở trên, tôi đã thử nghiệm điều này với một phiên bản cũ, nhưng chưa có trên iOS6.)


Kể từ Xcode 9 iOS 11.4 SDK, đây vẫn là giải pháp cho tôi. [nhãnOne setFont: [UIFont fontWithName: @ "HelveticaNeue" kích thước: 20]]; nhãnOne.textAlocation = NSTextAlocateLeft; // Lấy ra - kCTLeftTextAlocation; nhãnOne.text = dateStr; [headerView addSubview: nhãnOne];
Matthew Ferguson

19

NSTextAlignmentCentercó thể được sử dụng thay thế UITextAlignmentCentervà một danh sách các thay thế khác bên dưới:

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

1
Điều này làm việc cho tôi. Đã thử nghiệm trên trình giả lập cho iOS 6.1 và 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];

Một xây dựng tốt hơn sẽ được sử dụng một cái gì đó giống như: #ifdef (__IPHONE_OS_VERSION_MIN_REQUIRED> = __IPHONE_6_0) .... Nếu không, bạn sẽ được nhận UITextAlignmentCenter trong iOS 7.
Ray Fix

13

Bạn không phải làm một trong những điều này. Xcode 4.5 sẽ biên dịch NSTextAlignmentCenter, v.v. tốt trong iOS 5.


1
Điều này dường như là đúng. Tôi gặp vấn đề với UILineBreakMode và UITextAlocation-- và thay thế chúng bằng NSLineBreakMode và NSTextAlocation-- hoạt động tốt trong Xcode 4.6.3 trong trình giả lập 5.0 và trên iPad chạy 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];


0

Tôi đã có một vấn đề tương tự và đã sử dụng như sau: chi tiếtLabel.textAlocation = NSTextAlocateCenter;


0

trong iOS 6 trở lên

sử dụng giá trị này:

self.lbl_age.textAlignment=NSTextAlignmentCenter;


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.