2015-09-08 39 views
0

發現了一個類似的問題我的(this), 但我的問題似乎與視圖層次結構有點關聯。在NSTextView上更改NSView的NSCursor

我有一個NSTextView,然後作爲兄弟的意見,其他幾個NSView的頂部。

上面掛的問題,我設置一個跟蹤區域類似,並應用於光標這樣:

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

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

它似乎徘徊在工作,但馬上又回到了IBeam Cursor,這是此CursorChangingView下的NSTextViews的默認光標。

這是適用於在鼠標懸停在某個NSView上時應用更改光標的正確方法,並且它是覆蓋我的重寫的NSTextView?

回答

2

您只需要爲自定義視圖創建子類,重寫awakeFromNib方法,爲[.mouseMoved,.activeAlways]事件添加自定義跟蹤區域:NSTrackingArea Info。沒有必要重寫resetCursorRects和/或updateTrackingAreas。所有你需要的是重寫的mouseMoved方法,並設置有希望的光標:

備註discardCursorRects方法:

從文檔

你你需要從不調用此方法直接

Xcode 9•斯威夫特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的回答, 但我設法解決它,所以我會後我的答案了。

在我的情況下,出於某種原因,mouseEnteredmouseEntered根本不起作用。

因此,這裏是我的代碼,終於得到它的工作:

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