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

use*_*123 190 label alignment ios

似乎UITextAlignmentCenter在iOS 6中已弃用.

我仍然使用它并且效果很好,但它会发出警告.

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

label.textAlignment = UITextAlignmentCenter;
Run Code Online (Sandbox Code Playgroud)

谢谢.

maj*_*oat 393

在iOS6中你可以使用

label.textAlignment = NSTextAlignmentCenter;
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • majorl3oat:使用常数而不是枚举不是最佳做法.枚举有助于代码的可读性,这是一个非常重要的因素.未来它可能会破坏只是来自Apple的糟糕设计,如果它们打破了它,我宁愿有编译错误而不是冒险在没有我注意的情况下对齐出错. (17认同)
  • 罗宾完全正确.毫无疑问,使用enum IS最佳实践.你总是可以假设NSTextAlignmentCenter意味着中心,你可以不假设1总是意味着中心.除非Apple完全愚蠢. (6认同)
  • 你也可以在iOS 5中使用它,使用Xcode 4.5或更高版本. (3认同)

Wie*_*nke 44

labelAlignment属性变化可能与苹果的引入NSAttributedStrings更多iOS的控制,因此需要改变UIText ...属性NSText ...性质.

所以,如果你升级到iOS6,你就是三叶草; 只需切换UITextAlignmentCenterNSTextAlignmentCenter享受花哨的新弦乐.

但是如果你正在处理一个复杂的项目并希望地球不会在你的脚下移动太多,你可能想要坚持使用旧版本一段时间,并使你的代码适应多个版本,如下所示:

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

上述方法适用于新方法 ; 你得到警告,但一切都运行良好.但是当编译器看到它不知道的常量时,它会变成红色并停在其轨道上.没有办法偷偷溜过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
Run Code Online (Sandbox Code Playgroud)

…你可以这样做:

label.textAlignment = kLabelAlignmentCenter;
Run Code Online (Sandbox Code Playgroud)

还有这个:

label.lineBreakMode = kLabelTruncationMiddle;
Run Code Online (Sandbox Code Playgroud)

等等.

由于这些UIText/NSText更改可能会出现多个控件,因此这种方法非常方便.

(警告:作为前面提到的稳定爱好者的一员,我已经用旧版本测试了这个版本,但还没有使用iOS6.)


小智 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
Run Code Online (Sandbox Code Playgroud)


neo*_*eye 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];
Run Code Online (Sandbox Code Playgroud)


Aar*_*ger 13

您不必执行其中任何一项操作.Xcode 4.5将NSTextAlignmentCenter在iOS 5中编译等等.