Есть костюмный NSView. В нем прописываем код для детекции события когда курсор мыши, при ее перемещении, попадая на отрезок (его NSBezierPath) изменяется и когда вне NSBezierPath этого отрезка восстанавливает прежний, дефолтный вид.
override func viewDidMoveToWindow()
{
let trackingArea = NSTrackingArea(rect: CGRect(x: 0.0, y: 0.0, width: self.bounds.width, height: self.bounds.height), options: [.activeAlways, .mouseEnteredAndExited, .mouseMoved], owner: self, userInfo: nil)
self.addTrackingArea(trackingArea)
}
override func mouseEntered(with event: NSEvent)
{
self.window?.acceptsMouseMovedEvents = true
self.window?.makeFirstResponder(self)
}
override func mouseMoved(with event: NSEvent)
{
let mouseLocationNSPoint = self.convert(event.locationInWindow, from: nil)
if arrayOfNames_NSBezierPaths.isEmpty != true
{
for each in arrayOfNames_NSBezierPaths
{
if each.1.contains(mouseLocationNSPoint) == true
{
NSCursor.pointingHand().set()
}
else if each.1.contains(mouseLocationNSPoint) != true
{
NSCursor.arrow().set()
}
}
}
}
С кодом выше есть две проблемы.
Во-первых, изменение курсора мыши происходит нормально только для одного отрезка - подводим мышь - курсор меняется, убираем - возвращается к дефолтному виду. И этот отрезок самый нижний. Для других отрезков, курсор подрагивает - то нормальный, то измененный, убираем получаем нормальный (дефолтный).
Во-вторых, размер NSView больше чем видимая часть, соотвественно есть скроллинг по вертикали и горизонтали. Если мышь не в видимой части, то видим что есть детекция отрезков вне видимой части NSView - подрагивание курсора мыши. Я так понимаю это связано с self.window?.makeFirstResponder(self). Если убираем self.window?.makeFirstResponder(self), то детектируется только начальная видимая часть и если скролить то отрезки исходно скрытые не детектируются.
Вообщем, запутался я с этим tracking area для NSBezierPath. Нужна помощь !!!