根据内容检测文本方向

May*_*sam 10 swift

我想知道是否可以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)