iOS 6中的标签对齐-不推荐使用UITextAlignment


190

似乎UITextAlignmentCenter在iOS 6中已弃用。

我仍然使用它并且运行良好,但是会发出警告。

我怎样才能解决这个问题?

label.textAlignment = UITextAlignmentCenter;

谢谢。


7
有根据的猜测:NSTextAlignment
JustSid 2012年

1
请改用NSTextAlignment。
Jayprakash Dubey 2014年

Answers:


394

在iOS6中,您可以使用

label.textAlignment = NSTextAlignmentCenter;

希望这可以帮助。


枚举可能会在将来的某个时候更改,并导致意外的结果。就这样。在这种情况下,不会出现世界末日的情况,但应采用更好的做法。
布伦登

17
majorl3oat:最好不要使用常量代替枚举。枚举有助于提高代码的可读性,这是一个非常重要的因素。苹果将​​来可能会破坏它只是一个糟糕的设计,如果他们破坏了它,我宁愿有编译错误,也不愿冒着对齐错误而未引起注意的风险。
罗宾·安德森

6
罗宾完全正确。毫无疑问,使用枚举是最佳实践。您可以始终假定NSTextAlignmentCenter表示CENTER,而不能始终假定1始终表示CENTER。除非苹果完全愚蠢。
Rasmus 2012年

枚举是专门为避免将来的代码中断而编写的。如果他们决定1应该是42,则枚举将继续起作用,硬编码值将失败。
Bryan Oakley

是的,请删除textAlignment = 1,它将使人们感到困惑并传播不良知识
MobileMon

45

labelAlignment属性更改可能与Apple在更多的iOS控件中引入NSAttributedStrings有关,因此需要将UIText…属性更改为NSText…属性。

因此,如果您已升级到iOS6,那么您将陷入困境。只需从切换UITextAlignmentCenterNSTextAlignmentCenter并享受新奇的弦乐。

但是,如果您正在处理一个复杂的项目,并且希望地球不会在您的脚下移动太多,那么您可能需要坚持使用旧版本一段时间,然后将代码修改为多个版本,如下所示:

// 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更改可能会弹出多个控件,因此此方法非常方便。

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


从Xcode 9 iOS 11.4 SDK开始,这仍然是我的解决方案。[labelOne setFont:[UIFont fontWithName:@“ HelveticaNeue”大小:20]];labelOne.textAlignment = NSTextAlignmentLeft; //了解-kCTLeftTextAlignment; labelOne.text = dateStr; [headerView addSubview:labelOne];
马修·弗格森

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
雷修复

13

您无需执行任何一项操作。Xcode 4.5将NSTextAlignmentCenter在iOS 5中很好地编译,等等。


1
这似乎是真的。我遇到了UILineBreakMode和UITextAlignment的问题-并用NSLineBreakMode和NSTextAlignment替换了它们-在5.0模拟器的Xcode 4.6.3和运行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];


0

我有一个类似的问题,并使用了以下内容:detailsLabel.textAlignment = NSTextAlignmentCenter;


0

在iOS 6或更高版本中

使用此值:

self.lbl_age.textAlignment=NSTextAlignmentCenter;


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.