Ste*_*ord 25 interface-builder ios autolayout
我终于开始与Auto Layout进行摔跤,似乎无法弄清楚如何从右到左(RTL)支持以我期望/想要的方式工作......
我在Interface Builder中设计了如下所示的视图:
使用英语时,生成的应用程序按预期运行:
但是,当切换到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答案的语言.
跟进肯的回答
设置textAlignment
为NSTextAlignmentNatural
是不可能的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
.
@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)
归档时间: |
|
查看次数: |
17204 次 |
最近记录: |