我想知道是否可以UITextView根据其内容动态设置文本方向?
默认行为是这样的:如果您使用LTR语言开始一行该行将是LTR,但如果您使用RTL语言开始下一行该行的方向将更改为RTL.
我想要的是根据第一个设置整个段落的方向.
可能吗?
小智 9
我自己也遇到过这个问题.通过一点点搜索,为UITextView制作了这个扩展,它可以检测第一个字母的语言,并在需要时进行RTL.您需要在设置文本后调用该函数,因此您可能希望在UITextViewDelegate文本更改"方法中调用它.
extension UITextView {
func detectRightToLeft() {
if let text = self.text where !text.isEmpty {
let tagschemes = NSArray(objects: NSLinguisticTagSchemeLanguage)
let tagger = NSLinguisticTagger(tagSchemes: tagschemes as! [String], options: 0)
tagger.string = text
let language = tagger.tagAtIndex(0, scheme: NSLinguisticTagSchemeLanguage, tokenRange: nil, sentenceRange: nil)
if language?.rangeOfString("he") != nil || language?.rangeOfString("ar") != nil || language?.rangeOfString("fa") != nil {
self.text = text.stringByReplacingOccurrencesOfString("\n", withString: "\n")
self.textAlignment = .Right
self.makeTextWritingDirectionRightToLeft(nil)
}else{
self.textAlignment = .Left
self.makeTextWritingDirectionLeftToRight(nil)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
当然这是凌乱而不完美的.但它对我有用.你可以得到这个想法.
斯威夫特3:
extension UITextView {
func detectRightToLeft() {
if let text = self.text, !text.isEmpty {
let tagschemes = NSArray(objects: NSLinguisticTagSchemeLanguage)
let tagger = NSLinguisticTagger(tagSchemes: tagschemes as! [String], options: 0)
tagger.string = text
let language = tagger.tag(at: 0, scheme: NSLinguisticTagSchemeLanguage, tokenRange: nil, sentenceRange: nil)
if language?.range(of: "he") != nil || language?.range(of: "ar") != nil || language?.range(of: "fa") != nil {
self.text = text.replacingOccurrences(of: "\n", with: "\n")
self.textAlignment = .right
self.makeTextWritingDirectionRightToLeft(nil)
}else{
self.textAlignment = .left
self.makeTextWritingDirectionLeftToRight(nil)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)