iOS 6中的标签对齐 - UITextAlignment已被废弃

193

看起来在iOS 6中UITextAlignmentCenter被弃用了。

虽然我仍在使用它并且它能正常工作,但是会有一个警告。

我该如何解决这个问题?

label.textAlignment = UITextAlignmentCenter;

谢谢。


7
“NSTextAlignment” 的意思是“文本对齐方式”,这是一个iOS开发中常用的术语。 - JustSid
1
请使用NSTextAlignment。 - Jayprakash Dubey
11个回答

399

iOS 6中可以使用

label.textAlignment = NSTextAlignmentCenter;

枚举类型在未来可能会发生变化,从而导致意外的结果。这并不是末日场景,但更好的实践应该占主导地位。 - Brenden
17
使用常数值而非枚举类型并不是最佳实践。枚举类型可以提高代码的可读性,这是一个极其重要的因素。若果在将来它可能会出现问题,这只是苹果公司糟糕的设计,如果他们改变了它,我宁愿出现编译错误,也不要冒风险导致对齐出错而我却没有察觉到。 - Robin Andersson
6
罗宾完全正确。使用枚举是最佳实践,毫无疑问。你始终可以假设NSTextAlignmentCenter表示居中,但你绝不能假设1始终表示居中。除非苹果公司非常愚蠢。 - Rasmus
枚举类型的作用在于代码不会因为未来的更改而出现错误。如果他们决定将1改为42,枚举类型仍然可以正常工作,而硬编码的值则会失败。 - Bryan Oakley
请移除 textAlignment = 1 的代码,它会让人们感到困惑并传递错误的知识。 - MobileMon
@Rasmus — 嗯,看起来苹果公司相当愚蠢。请查看 UIKit 中的 NSText.h 文件。在那里,如果目标操作系统是 iPhone,则将 1 定义为居中,否则将其定义为右对齐。更有理由使用 NSTextAlignmentCenter - Todd Lehman

44
属性的更改可能与苹果将NSAttributedStrings引入更多iOS控件有关,因此需要将UIText...属性更改为NSText...属性。

所以如果您升级到iOS6,您就可以轻松完成了;只需从切换到,并享受新的字符串。

但是,如果您正在处理一个复杂的项目,并且希望地球不要在您的脚下移动太多,请暂时使用旧版本,并为多个版本适应您的代码,例如:

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

And this:

label.lineBreakMode = kLabelTruncationMiddle;

等等。

由于这些UIText / NSText更改可能会在多个控件中弹出,因此此方法非常方便。

(警告:作为上述稳定地球爱好者的一员,我已经使用旧版本进行了测试,但尚未测试iOS6。)


截至Xcode 9 iOS 11.4 SDK,这仍然是我的解决方案。 [labelOne setFont:[UIFont fontWithName:@“HelveticaNeue” size: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) …. 否则你会在iOS 7中得到UITextAlignmentCenter。 - Ray Fix

13

你不必这两个都做。Xcode 4.5可以在iOS 5中编译NSTextAlignmentCenter等内容。


1
这似乎是正确的。我遇到了UILineBreakMode和UITextAlignment的问题,将它们替换为NSLineBreakMode和NSTextAlignment在Xcode 4.6.3中的5.0模拟器和运行5.-的iPad上正常工作。 - 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];

1
labelName.textAlignment=NSTextAlignmentLeft;

0

Swift 3:

label.textAlignment = NSTextAlignment.center

0
我曾经遇到过类似的问题,使用了以下代码: detailsLabel.textAlignment = NSTextAlignmentCenter;

0

在 iOS 6 或更高版本中

使用此值:

self.lbl_age.textAlignment=NSTextAlignmentCenter;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接