Общая идея: выделить группы символов в текстовом абзаце в NSScrollView
(который содержит NSTextView
).Я получаю ограничивающий прямоугольник выбранных символов из NSLayoutManager.boundingRect()
и создаю CAShapeLayer
с его координатами / размером вместо символов.
Проблема заключается в том, что если рассматриваемый диапазон символов охватывает две строки,ограничивающий прямоугольник будет охватывать их обоих по высоте и ширине, поэтому мне нужно сделать это для каждой строки текста в текстовом представлении.
Вопрос, о котором идет речь: свойства строки в NSTextView
, NSTextStorage
и NSTextContainer
возвращают строки без разрывов строки ("\n"
).Как я могу:
1) найти фактическое текстовое значение текстового представления с разрывами строк?
2) использовать другие методы для перебора строк текстового представления?
3) использовать другие библиотеки для реализации моей общей идеи?
Код моего View Controller:
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var textView: NSTextView!
@IBOutlet weak var shapeView: NSView!
override func viewDidLoad() {
super.viewDidLoad()
shapeView.wantsLayer = true
textView.string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
}
@IBAction func checkButtonPressed(sender: NSButton) {
let range = NSMakeRange(2, 5) //Creating a makeshift range for testing purposes
let layoutManager = textView.layoutManager
var textRect = NSRect()
//Accessing bounding rectangle of the chosen characters
textRect = (layoutManager?.boundingRect(forGlyphRange: range, in: textView.textContainer!))!
//Creating a parent layer and assigning it as the main layer of the shape view
let parentShapeLayer = CAShapeLayer()
shapeView.layer = parentShapeLayer
//Creating an actual rectangle - CAShapeLayer
let shapeLayer = CAShapeLayer()
parentShapeLayer.addSublayer(shapeLayer)
parentShapeLayer.isGeometryFlipped = true
shapeLayer.frame = textRect
shapeLayer.backgroundColor = NSColor.yellow.cgColor
if let string = textView.textStorage?.string {
for var char in string {
if (char == "\n") {
print(char) //Does not print anything
}
}
}
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
PS Я знаю, что *У 1032 * есть метод drawBackground()
, и я не смог найти, в каком контексте он нужен, но это другой вопрос.