You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单个UITextView中正确对齐英文与阿拉伯文本?

实现UITextView中英文左对齐、阿拉伯文右对齐的混排效果

这个需求确实很实际——默认的UITextView只能用统一的对齐方式,没法区分不同语言的文本方向。不过我们可以通过NSAttributedString结合段落样式,给不同语言的文本片段单独设置对齐,完美解决交叉混排的问题。

实现思路

  • 分割文本片段:把原始文本按字符的书写方向(LTR左到右/RTL右到左)分割成连续的片段,让英文、阿拉伯文各自成为独立的块。
  • 设置段落样式:给每个片段对应的方向设置对齐方式——英文用左对齐,阿拉伯文用右对齐。
  • 拼接富文本:把所有带样式的片段拼接成一个完整的NSAttributedString,赋值给UITextView即可。

Swift代码实现

首先,写一个工具函数来按方向分割文本:

func splitStringIntoDirectionSegments(_ text: String) -> [(text: String, isRTL: Bool)] {
    var segments = [(text: String, isRTL: Bool)]()
    guard !text.isEmpty else { return segments }
    
    // 初始化第一个片段
    var currentText = String(text.first!)
    var currentIsRTL = text.first!.isRightToLeft
    
    // 遍历剩余字符,按方向分组
    for char in text.dropFirst() {
        let charIsRTL = char.isRightToLeft
        if charIsRTL == currentIsRTL {
            currentText.append(char)
        } else {
            segments.append((currentText, currentIsRTL))
            currentText = String(char)
            currentIsRTL = charIsRTL
        }
    }
    // 添加最后一个片段
    segments.append((currentText, currentIsRTL))
    return segments
}

然后,创建带混合对齐的富文本:

func createMixedAlignmentAttributedString(from text: String) -> NSAttributedString {
    let segments = splitStringIntoDirectionSegments(text)
    let attributedString = NSMutableAttributedString()
    
    for segment in segments {
        // 创建段落样式
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.alignment = segment.isRTL ? .right : .left
        // 可根据需求添加行间距等统一样式
        paragraphStyle.lineSpacing = 4
        
        // 设置文本属性(字体、颜色等可自定义)
        let attributes: [NSAttributedString.Key: Any] = [
            .paragraphStyle: paragraphStyle,
            .font: UIFont.systemFont(ofSize: 16)
        ]
        
        let segmentString = NSAttributedString(string: segment.text, attributes: attributes)
        attributedString.append(segmentString)
    }
    
    return attributedString
}

使用方式

在你的ViewController里,直接给UITextView赋值即可:

let mixedText = "This is some text اهلا بكم More English text"
yourTextView.attributedText = createMixedAlignmentAttributedString(from: mixedText)

注意事项

  • 确保你使用的字体支持阿拉伯文显示(比如系统默认的UIFont.systemFont是支持的,自定义字体需要确认包含阿拉伯文字形)。
  • 如果文本中包含数字等特殊字符,默认会归为LTR方向,如果需要让数字跟随阿拉伯文的RTL上下文,可以调整方向判断的逻辑(比如结合更精细的Unicode属性检测)。

内容的提问来源于stack exchange,提问作者Android Admirer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:47:00