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

Swift中UITextView实现当前输入行单独居中对齐的方法问询

这个需求其实可以通过操作UITextView的NSAttributedString和段落样式来实现,核心是精准定位当前输入的行(或者说段落),然后单独给它设置居中对齐,同时保留原有文本的其他格式(比如你已经实现的粗体)。下面是具体的实现步骤和代码:

第一步:获取当前输入行的范围

首先写一个工具方法,借助UITextView的layoutManager来定位光标所在行对应的文本范围:

private func getCurrentLineRange(in textView: UITextView) -> NSRange? {
    guard let selectedRange = textView.selectedTextRange else { return nil }
    
    // 获取光标所在行的起始和结束位置
    let startPosition = selectedRange.start
    let endOfLinePosition = textView.layoutManager.lineEndPosition(for: startPosition)
    
    // 转换为NSRange格式
    let startIndex = textView.offset(from: textView.beginningOfDocument, to: startPosition)
    let endIndex = textView.offset(from: textView.beginningOfDocument, to: endOfLinePosition)
    
    return NSRange(location: startIndex, length: endIndex - startIndex)
}

第二步:实现居中按钮的点击逻辑

接下来是按钮点击的处理方法,我们会获取当前行范围,创建并应用居中段落样式,同时保留原有文本的其他属性:

@IBAction func centerAlignCurrentLineTapped(_ sender: UIButton) {
    // 替换成你自己的UITextView实例
    guard let currentLineRange = getCurrentLineRange(in: yourTextView) else { return }
    
    // 将现有文本转为可变属性字符串,方便修改
    let mutableAttrText = NSMutableAttributedString(attributedString: yourTextView.attributedText)
    
    // 创建段落样式:先继承当前行已有的段落设置,避免覆盖行间距、缩进等原有配置
    let paragraphStyle = NSMutableParagraphStyle()
    if let existingStyle = mutableAttrText.attribute(.paragraphStyle,
                                                   at: currentLineRange.location,
                                                   effectiveRange: nil) as? NSParagraphStyle {
        paragraphStyle.setParagraphStyle(existingStyle)
    }
    // 设置居中对齐
    paragraphStyle.alignment = .center
    
    // 给当前行应用新的段落样式
    mutableAttrText.addAttribute(.paragraphStyle,
                                 value: paragraphStyle,
                                 range: currentLineRange)
    
    // 更新UITextView的文本内容
    yourTextView.attributedText = mutableAttrText
    
    // 可选:如果希望后续在当前行输入的文本保持居中,就打开下面这行注释
    // yourTextView.typingAttributes[.paragraphStyle] = paragraphStyle
    // 但根据你的需求,换行后新行应该回到默认对齐,所以默认不需要加这行
}

第三步:关联按钮事件

最后把你的居中按钮的Touch Up Inside事件,关联到上面的centerAlignCurrentLineTapped方法就可以了。

额外细节说明

  • 为什么要继承现有段落样式?如果当前行已经有行间距、缩进等设置,直接新建段落样式会覆盖这些配置,先继承再修改对齐方式能最大程度保留原有格式。
  • 如果想支持选中多行时批量设置居中,可以修改getCurrentLineRange方法:判断选中范围的长度,如果大于0,直接使用选中的NSRange即可。
  • 关于后续输入:不加typingAttributes设置的话,当前行继续输入会保持居中,但换行后新行会回到UITextView的默认对齐样式,完全符合你“仅当前输入行居中、不影响其他行”的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:33:40