2015-09-08 2 views
0

Нашел аналогичный вопрос для моего (this), , но мои проблемы, похоже, немного связаны с иерархией представлений.Изменение NSCursor для NSView над NSTextView

У меня есть NSTextView, затем как вид сестры, несколько других NSViews поверх него.

Подобный вопрос связан выше, настройки я отслеживая область, и применяется курсор, как например:

class CursorChangingView: NSView { 
    override func updateTrackingAreas() { 
     let trackingArea = NSTrackingArea(rect: 
    } 

    override func cursorUpdate(event: NSEvent) { 
     NSCursor.arrowCursor().set() 
    } 
} 

Это, кажется, работает при наведении курсора мыши, но тут же восходит к IBeam Cursor, который является по умолчанию для NSTextViews в этом CursorChangingView.

Является ли это подходящим способом применения изменения курсора при наведении указателя мыши на определенный NSView и является ли NSTextView под его переопределением моего переопределения?

ответ

2

Все, что вам нужно - это подклассы пользовательского вида, переопределить метод awakeFromNib, добавить пользовательскую зону отслеживания для событий [.mouseMoved, .activeAlways]: NSTrackingArea Info. Нет необходимости переопределять resetCursorRects и/или updateTrackingAreas. Все, что вам нужно переопределить метод mouseMoved и установить нужный курсор там:

Примечание о discardCursorRects метод:

Из документов

Вы Вы никогда не должны вызывать этот метод непосредственно

Xcode 9 • Swift 4

import Cocoa 

class CursorChangingView: NSView { 

    override func awakeFromNib() { 

     addTrackingArea(NSTrackingArea(rect: bounds, options: [.activeAlways, .mouseMoved], owner: self, userInfo: nil)) 

     wantsLayer = true 
     layer?.backgroundColor = NSColor.cyan.cgColor 
     layer?.borderColor = NSColor.black.cgColor 
     layer?.borderWidth = 1 
    } 

    @objc override func mouseMoved(with theEvent: NSEvent) { 
     NSCursor.pointingHand.set() 
    } 
} 

import Cocoa 

class ViewController: NSViewController { 

    override func viewWillAppear() { 
     super.viewWillAppear() 
     view.window?.styleMask.remove(.resizable) 
    } 
} 

Sample

2

Спасибо @Leo Dabus за ваш ответ, , но мне удалось ее решить, так что я отправлю мой ответ тоже.

В моем случае по какой-либо причине mouseEntered и mouseEntered не работал вообще.

Так вот мой код, наконец, получил его на работу:

class CursorChangingView: NSView { 
    let trackingArea: NSTrackingArea? 
    func setupTracking() { 
     if self.trackingArea == nil { 
      self.trackingArea = NSTrackingArea(rect: self.bounds, options: NSTrackingAreaOptions.ActiveAlways | NSTrackingAreaOptions.MouseMoved | NSTrackingAreaOptions.CursorUpdate | NSTrackingAreaOptions.MouseEnteredAndExited | NSTrackingAreaOptions.ActiveInActiveApp, owner: self, userInfo: nil) 
      self.addTrackingArea(self.trackingArea!) 
     } 
    } 

    override func updateTrackingAreas() { 
     self.trackingArea = NSTrackingArea(rect: self.bounds, options: NSTrackingAreaOptions.ActiveAlways | NSTrackingAreaOptions.CursorUpdate | NSTrackingAreaOptions.MouseEnteredAndExited | NSTrackingAreaOptions.ActiveInActiveApp, owner: self, userInfo: nil) 
     self.addTrackingArea(self.trackingArea!) 
    } 

    override func resetCursorRects() { 
     self.discardCursorRects() 
     self.addCursorRect(self.bounds, cursor: NSCursor.arrowCursor()) 
    } 

    override func mouseMoved(theEvent: NSEvent) { 
     NSCursor.arrowCursor().set() 
    } 
} 

Это может быть немного чрезмерным, но работал, так что поделюсь это как мое собственное решение.

+0

В моем случае это все еще мерцает, когда 'CursorChangingView' находится над' NSTextView'. Как вы избавились от этого? – ctietze

Смежные вопросы