AutoLayout + RTL + UILabel文本对齐

Ste*_*ord 25 interface-builder ios autolayout

我终于开始与Auto Layout进行摔跤,似乎无法弄清楚如何从右到左(RTL)支持以我期望/想要的方式工作......

我在Interface Builder中设计了如下所示的视图:

IB

使用英语时,生成的应用程序按预期运行:

英语

但是,当切换到RTL语言(在这种情况下是阿拉伯语)时,整个视图翻转(这很好),但是UILabel文本仍然是左对齐的.我希望它是正确的对齐,以保持它对抗UIImageView.

阿拉伯

很明显,我遗漏了一些东西和/或这不属于自动布局.

我应该textAlignment在使用RTL语言时手动设置吗?

Ken*_*Ken 29

你想要的NSTextAlignmentNatural.这推断了加载的应用程序语言(而不是脚本)的文本对齐方式.

对于iOS 9及更高版本(使用Xcode 7),您可以在故事板中设置它(选择---对齐选项).如果您需要定位早期版本,则需要为标签创建一个插座并设置对齐方式awakeFromNib.

- (void)awakeFromNib {
    [[self label] setTextAlignment:NSTextAlignmentNatural];
}
Run Code Online (Sandbox Code Playgroud)


Avi*_*oss 12

对我来说,这些解决方案没有帮助,我最终做了一些非常难看的事情,但它是唯一一个为我做这个伎俩的人.我把它添加为一个NSString类别:

的NSString + Extras.h:

#import <Foundation/Foundation.h>

@interface NSString (Extras)
- (NSTextAlignment)naturalTextAligment;
@end
Run Code Online (Sandbox Code Playgroud)

的NSString + Extras.m:

#import "NSString+Extras.h"

@implementation NSString (Extras)

- (NSTextAlignment)naturalTextAligment {
    NSArray *tagschemes = [NSArray arrayWithObjects:NSLinguisticTagSchemeLanguage, nil];
    NSLinguisticTagger *tagger = [[NSLinguisticTagger alloc] initWithTagSchemes:tagschemes options:0];
    [tagger setString:self];
    NSString *language = [tagger tagAtIndex:0 scheme:NSLinguisticTagSchemeLanguage tokenRange:NULL sentenceRange:NULL];
    if ([language rangeOfString:@"he"].location != NSNotFound || [language rangeOfString:@"ar"].location != NSNotFound) {
        return NSTextAlignmentRight;
    } else {
        return NSTextAlignmentLeft;
    }
}
@end
Run Code Online (Sandbox Code Playgroud)

为了检测我使用这个SO答案的语言.


Ste*_*ord 5

跟进肯的回答

设置textAlignmentNSTextAlignmentNatural是不可能的UILabel,它将导致抛出异常:

Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: 'textAlignment does not accept NSTextAlignmentNatural'
Run Code Online (Sandbox Code Playgroud)

它在使用属性文本时确实有效,并且可以在 Interface Builder 中进行设置,如下所示:

属性文本自然对齐

但是,在本地化故事板时,似乎没有选取属性文本。

为了解决这个问题,我UILabel在 Interface Builder中将配置保留为普通,并NSAttributedString使用标签的文本创建了一个,在属性字符串上设置对齐并将其分配给标签的attributedText属性:

-(void)viewDidLoad
{
    [super viewDidLoad];

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.alignment = NSTextAlignmentNatural;

    NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:self.lbl.text];
    [string addAttribute:NSParagraphStyleAttributeName
                   value:paragraphStyle
                   range:NSMakeRange(0, string.length)];

    self.lbl.attributedText = string;
}
Run Code Online (Sandbox Code Playgroud)

这在这个简单的情况下工作正常,但是当您需要更复杂的属性字符串样式时,我可以看到它会失败。但显然在这种情况下,您可能只是NSLocalizedString在创建NSAttributedString.

  • 它不再在 iOS 7 中崩溃,但它似乎没有正确对齐 RTL 文本:/ (4认同)

Hus*_*sam 5

@Aviel答案作为快速的UILabel扩展

//MARK: UILabel extension
extension UILabel {
    func decideTextDirection () {
        let tagScheme = [NSLinguisticTagSchemeLanguage]
        let tagger    = NSLinguisticTagger(tagSchemes: tagScheme, options: 0)
        tagger.string = self.text
        let lang      = tagger.tagAtIndex(0, scheme: NSLinguisticTagSchemeLanguage,
            tokenRange: nil, sentenceRange: nil)

        if lang?.rangeOfString("he") != nil ||  lang?.rangeOfString("ar") != nil {
            self.textAlignment = NSTextAlignment.Right
        } else {
            self.textAlignment = NSTextAlignment.Left
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用它 ?

label.text = "????? ?????? ???????" // Assign text
label.decideTextDirection()          // Decide direction
Run Code Online (Sandbox Code Playgroud)