gpt4 book ai didi

swift - 如何在 swift 中逐行突出显示 UITextView 的文本?

转载 作者:可可西里 更新时间:2023-11-01 01:58:12 25 4
gpt4 key购买 nike

我试图逐行突出显示 UITextView 中的文本。我想遍历每一行并突出显示那一行供用户查看,然后我想删除突出显示效果以为下一行做准备。我已经尝试创建解决方案但未能成功,这是我现在最好的机会。

这是我到目前为止一直在做的一些工作,它目前用“NSBackgroundColor 1101”填充 UITextView 出于某种原因,我不知道为什么是。

func highlight() {
let str = "This is\n some placeholder\n text\nwith newlines."
var newStr = NSMutableAttributedString(string: "")
var arr:[String] = str.components(separatedBy: "\n")

var attArr:[NSMutableAttributedString] = []

for i in 0..<arr.count {
attArr.append(NSMutableAttributedString(string: arr[i]))
}

for j in 0..<attArr.count {
let range = NSMakeRange(0, attArr[j].length)
attArr[j].addAttribute(.backgroundColor, value: UIColor.yellow, range: range)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5){
for m in 0..<attArr.count {
newStr = NSMutableAttributedString(string: "\(attArr[m])\n")
self.textView.attributedText = newStr

}
}
attArr[j].removeAttribute(.backgroundColor, range: range)
//remove from texview here
}
}

如您所见,该算法应该剥离 textView 文本,并通过用新行分隔符分隔每一行将其放入一个数组中。接下来要做的是创建一个数组,其中填充了相同的文本但作为可变属性字符串开始添加高亮属性。每次出现突出显示的行时,都会有一个小的延迟,直到下一行开始突出显示。如果有人可以帮助我或为我指明正确的方向以开始正确实现,那将大有帮助,

谢谢!

最佳答案

所以你想要这个:

demo

您需要 TextView 的内容始终是完整的字符串,并突出显示一行,但您的代码将其设置为仅突出显示的行。您的代码还会安排所有高亮显示同时发生 (.now() + 0.5),而不是在不同时间发生。

这是我的建议:

  1. 创建一个范围数组,每行一个范围。

  2. 使用该数组修改 TextView 的 textStorage,方法是根据需要删除和添加 .backgroundColor 属性以突出显示和取消突出显示行。

  3. 当您突出显示 n 行时,安排突出显示 n+1 行。这样做有两个好处:如果需要的话,提前取消动画会更容易和更有效,如果需要的话,让动画无限重复会更容易。

我使用这个 Playground 创建了上面的演示:

import UIKit
import PlaygroundSupport

let text = "This is\n some placeholder\n text\nwith newlines."
let textView = UITextView(frame: CGRect(x: 0, y:0, width: 200, height: 100))
textView.backgroundColor = .white
textView.text = text

let textStorage = textView.textStorage

// Use NSString here because textStorage expects the kind of ranges returned by NSString,
// not the kind of ranges returned by String.
let storageString = textStorage.string as NSString
var lineRanges = [NSRange]()
storageString.enumerateSubstrings(in: NSMakeRange(0, storageString.length), options: .byLines, using: { (_, lineRange, _, _) in
lineRanges.append(lineRange)
})

func setBackgroundColor(_ color: UIColor?, forLine line: Int) {
if let color = color {
textStorage.addAttribute(.backgroundColor, value: color, range: lineRanges[line])
} else {
textStorage.removeAttribute(.backgroundColor, range: lineRanges[line])
}
}

func scheduleHighlighting(ofLine line: Int) {
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) {
if line > 0 { setBackgroundColor(nil, forLine: line - 1) }
guard line < lineRanges.count else { return }
setBackgroundColor(.yellow, forLine: line)
scheduleHighlighting(ofLine: line + 1)
}
}

scheduleHighlighting(ofLine: 0)

PlaygroundPage.current.liveView = textView

关于swift - 如何在 swift 中逐行突出显示 UITextView 的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49313188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com