内容简介:翻译自:https://stackoverflow.com/questions/41962952/how-to-use-colour-for-text-colouring-without-slowing-down-the-process
for i in 0..<arrayOfNSRangesForA.count { textFromStorage.addAttribute(NSForegroundColorAttributeName, value: NSColor.green, range: arrayOfNSRangesForA[i]) } for i in 0..<arrayOfNSRangesForT.count { textFromStorage.addAttribute(NSForegroundColorAttributeName, value: NSColor.green, range: arrayOfNSRangesForT[i]) } for i in 0..<arrayOfNSRangesForC.count { textFromStorage.addAttribute(NSForegroundColorAttributeName, value: NSColor.green, range: arrayOfNSRangesForC[i]) }
更新
我发现了一件坏事.当我将着色从NSForegroundColorAttributeName更改为NSBackgroundColorAttributeName时,运行时间显着增加–10次.对于20 000个字符,NSFackgroundColorAttributeName为10秒,NSForegroundColorAttributeName为1秒,为一种颜色.如果三种颜色 – 相应的3和30秒.对我而言,Swift的功能非常糟糕!由于DNA的长度是数千个A,T,G,C字符,因此无法用DNA(ATGC序列)着色进行正常工作!
更新
在评论中,我建议只为文本的可见部分着色.我尝试过这种方法,与标准方式相比,即使对于较短的文本也是如此.因此,我有文本的NSRange文本的可见部分,并在滚动时使用通知滚动时在飞行中着色.这是一个糟糕的方式.
最大的障碍是在文本视图中布置所有这些属性字符.将DNA序列着色需要最少的时间.您可以采用分而治之的方法,而不是编写自己的布局管理器或文本存储类,而是通过一次对文本视图进行着色着色:
@IBOutlet var textView: NSTextView! var dnaSequence: String! var attributedDNASequence: NSAttributedString! @IBAction func colorize(_ sender: Any) { self.dnaSequence = "ACGT" // your plaintext DNA sequence self.attributedDNASequence = self.makeAttributedDNASequence() // Rendering long string with the same attributes throughout is extremely fast self.textView.textStorage?.setAttributedString(NSAttributedString(string: dnaSequence)) let step = 10_000 // colorize 10k characters at a time let delay = 0.2 // delay between each render for (i, location) in stride(from: 0, to: self.dnaSequence.characters.count, by: step).enumerated() { let length = min(step, self.dnaSequence.characters.count - location) let range = NSMakeRange(location, length) // Since we are modifying the textStorage of a GUI object (NSTextView) // we should do it on the main thread DispatchQueue.main.asyncAfter(deadline: .now() + (delay * Double(i))) { let subtext = self.attributedDNASequence.attributedSubstring(from: range) print("Replacing text in range \(location) to \(location + length)") self.textView.textStorage?.replaceCharacters(in: range, with: subtext) } } } // MARK: - var colorA = NSColor.red var colorC = NSColor.green var colorG = NSColor.blue var colorT = NSColor.black func makeAttributedDNASequence() -> NSAttributedString { let attributedText = NSMutableAttributedString(string: dnaSequence) var index = dnaSequence.startIndex var color: NSColor! for i in 0..<dnaSequence.characters.count { switch dnaSequence[index] { case "A": color = colorA case "C": color = colorC case "G": color = colorG case "T": color = colorT default: color = NSColor.black } attributedText.addAttribute(NSForegroundColorAttributeName, value: color, range: NSMakeRange(i,1)) index = dnaSequence.index(after: index) } return attributedText }
诀窍是使应用程序尽可能响应,以便用户不知道事情仍在后台完成.在一小段延迟(<= 0.3秒)的情况下,我无法快速滚动鼠标到达文本视图的末尾,然后一切都被着色(100k字符). 在一个100k字符的测试中,它花了0.7秒直到彩色字符串首次出现在文本视图中,而不是7秒,如果我一次完成所有内容.
翻译自:https://stackoverflow.com/questions/41962952/how-to-use-colour-for-text-colouring-without-slowing-down-the-process
以上所述就是小编给大家介绍的《数组 – 如何使用颜色进行文本着色而不会减慢进程?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Web 高级着色语言(WHLSL) - 为WebGPU设计的Web图形着色语言
- OpenGL ES 入门之旅--OpenGL ES顶点着色器和片元着色器
- WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码
- OpenGL/OpenGL ES入门: 顶点着色器与片元着色器(OpenGL过渡OpenGL ES)
- [译]背景:着色的物理和数学(3)
- 参考近百篇文献,“图像着色” 最全综述
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入理解C#(第3版)
斯基特 (Jon Skeet) / 姚琪琳 / 人民邮电出版社 / 2014-4-1 / 99.00元
本书是世界顶级技术专家“十年磨一剑”的经典之作,在C#和.NET领域享有盛誉。与其他泛泛介绍C#的书籍不同,本书深度探究C#的特性,并结合技术发展,引领读者深入C#的时空。作者从语言设计的动机出发,介绍支持这些特性的核心概念。作者将新的语言特性放在C#语言发展的背景之上,用极富实际意义的示例,向读者展示编写代码和设计解决方案的最佳方式。同时作者将多年的C#开发经验与读者分享,读者可咀其精华、免走弯......一起来看看 《深入理解C#(第3版)》 这本书的介绍吧!