การจัดแนวป้ายกำกับใน iOS 6 - UITextAlignment เลิกใช้แล้ว


190

ดูเหมือนว่าUITextAlignmentCenterเลิกใช้แล้วใน iOS 6

ฉันยังคงใช้มันและทำงานได้ดี แต่ก็มีคำเตือน

ฉันจะแก้ไขสิ่งนี้ได้อย่างไร

label.textAlignment = UITextAlignmentCenter;

ขอบคุณ


7
การเดาที่มีการศึกษา: NSTextAlignment.
JustSid

1
ใช้ NSTextAlignment แทน
Jayprakash Dubey

คำตอบ:


394

ใน iOS6 คุณสามารถใช้

label.textAlignment = NSTextAlignmentCenter;

หวังว่านี่จะช่วยได้


เป็นไปได้ว่า enum MAY อาจมีการเปลี่ยนแปลงในอนาคตและก่อให้เกิดผลลัพธ์ที่ไม่คาดคิด นั่นคือทั้งหมดที่ ไม่มีสถานการณ์วันโลกาวินาศในกรณีนี้ แต่การปฏิบัติที่ดีควรเป็นหลัก
Brenden

17
majorl3oat: ไม่ใช่วิธีที่ดีที่สุดในการใช้จำนวนคงที่แทน enum Enum ช่วยในการอ่านรหัสซึ่งเป็นปัจจัยสำคัญอย่างยิ่ง การที่มันจะแตกในอนาคตนั้นเป็นเพียงการออกแบบที่ไม่ดีจาก Apple และหากพวกเขาทำผิดพลาดฉันก็คงจะมีข้อผิดพลาดในการรวบรวมมากกว่าที่จะเสี่ยงว่าการจัดตำแหน่งผิดโดยที่ฉันไม่ได้สังเกต
Robin Andersson

6
โรบินถูกต้องครบถ้วน การใช้ enum เป็นแนวปฏิบัติที่ดีที่สุดอย่างไม่ต้องสงสัย คุณสามารถสันนิษฐานได้เสมอว่า NSTextAlignmentCenter หมายถึง CENTER คุณไม่สามารถสันนิษฐานได้ว่า 1 หมายถึง CENTER เสมอ เว้นแต่ว่าแอปเปิ้ลนั้นบ้าคลั่งอย่างสมบูรณ์
Rasmus

enum เป็นรหัสเฉพาะเพื่อไม่ให้รหัสแตกในอนาคต หากพวกเขาตัดสินใจว่า 1 ควรเป็น 42 ค่า enum จะยังคงทำงานต่อไปค่าฮาร์ดโค้ดจะล้มเหลว
ไบรอัน Oakley

ใช่โปรดลบ textAlignment = 1 มันจะทำให้ผู้คนสับสนและเผยแพร่ความรู้ที่ไม่ดี
MobileMon

45

การlabelAlignmentเปลี่ยนแปลงคุณสมบัติอาจเกี่ยวข้องกับการแนะนำ NSAttributedStrings ของ Apple ให้กับตัวควบคุม iOS มากขึ้นดังนั้นจึงจำเป็นต้องเปลี่ยนคุณสมบัติ UIText ... เป็นคุณสมบัติ NSText ...

ดังนั้นหากคุณอัพเกรดเป็น iOS6 คุณจะอยู่ในโคลเวอร์ เพียงสลับจากUITextAlignmentCenterเป็นNSTextAlignmentCenterและเพลิดเพลินไปกับสตริงใหม่ที่แปลกใหม่

แต่ถ้าคุณทำงานกับโครงการที่ซับซ้อนและต้องการให้โลกไม่เคลื่อนไหวมากนักคุณอาจต้องการที่จะอยู่กับเวอร์ชั่นที่เก่ากว่าสักพักแล้วปรับรหัสของคุณให้เป็นหลาย ๆ แบบดังนี้:

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

วิธีการดังกล่าวข้างต้นทำงานใหม่วิธีการ ; คุณได้รับคำเตือน แต่ทุกอย่างทำงานได้ดี แต่เมื่อคอมไพเลอร์เห็นค่าคงที่ซึ่งไม่รู้ว่ามันเปลี่ยนเป็นสีแดงและหยุดในแทร็กของมัน ไม่มีทางที่จะแอบNSTextAlignmentCenterผ่านมันไปได้ (อาจมีวิธีในการปรับแต่งพฤติกรรมของคอมไพเลอร์ที่นี่ แต่ดูเหมือนจะไม่เหมาะสม)

วิธีแก้ปัญหาคือการเพิ่มตัวกำหนดพรีโปรเซสเซอร์ที่มีเงื่อนไข ถ้าคุณใส่อะไรแบบนี้ลงในไฟล์ h ของชั้นเรียน (หรืออาจจะอยู่ในไฟล์ค่าคงที่ที่นำเข้า - ซึ่งต้องรวม#import <UIKit/UIKit.h>อยู่ด้วยเพื่อที่จะได้รู้เกี่ยวกับค่าคงที่ 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

... คุณสามารถทำสิ่งนี้:

label.textAlignment = kLabelAlignmentCenter;

และนี่:

label.lineBreakMode = kLabelTruncationMiddle;

เป็นต้น

เนื่องจากการเปลี่ยนแปลง UIText / NSText เหล่านี้มีแนวโน้มที่จะโผล่ขึ้นมาสำหรับการควบคุมหลายวิธีนี้จึงมีประโยชน์มาก

(Caveat: ในฐานะสมาชิกคนหนึ่งของคู่รักที่มั่นคงในโลกก่อนหน้านี้ฉันได้ทดสอบสิ่งนี้ด้วยเวอร์ชั่นเก่า แต่ยังไม่ได้ใช้กับ iOS6)


ในฐานะของ Xcode 9 iOS 11.4 SDK นี่ยังคงเป็นทางออกสำหรับฉัน [labelOne setFont: [UIFont fontWithName: @ "HelveticaNeue" ขนาด: 20]]; labelOne.textAlignment = NSTextAlignmentLeft; // นำออกมา - kCTLeftTextAlignment; labelOne.text = dateStr; [headerView addSubview: labelOne];
Matthew Ferguson

19

NSTextAlignmentCenterสามารถใช้แทนUITextAlignmentCenterและรายการของการทดแทนอื่น ๆ อยู่ด้านล่าง:

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

1
มันใช้งานได้สำหรับฉัน ทดสอบกับเครื่องจำลองสำหรับ iOS 6.1 และ 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];

สิ่งก่อสร้างที่ดีกว่าคือการใช้สิ่งที่ชอบมากขึ้น: #ifdef (__IPHONE_OS_VERSION_MIN_REQUIRED> = __IPHONE_6_0) .... มิฉะนั้นคุณจะได้รับ UITextAlignmentCenter ใน iOS 7
Ray Fix

13

คุณไม่ต้องทำอย่างใดอย่างหนึ่ง Xcode 4.5 จะรวบรวมNSTextAlignmentCenterและอื่น ๆ ปรับใน iOS 5


1
นี่ดูเหมือนจะเป็นจริง ฉันมีปัญหากับ UILineBreakMode และ UITextAlignment-- และแทนที่ด้วย NSLineBreakMode และ NSTextAlignment - ทำงานได้ดีใน Xcode 4.6.3 ในตัวจำลอง 5.0 และบน iPad ที่ทำงาน 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

ฉันมีปัญหาที่คล้ายกันและใช้สิ่งต่อไปนี้: detailsLabel.textAlignment = NSTextAlignmentCenter;



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.