簡體   English   中英

將鼠標懸停在 NSView 子視圖中

[英]Mouse over in a NSView subview

我有一個處理鼠標事件的 NSView 子類,在那個 NSView 里面我有一個子視圖(它是 NSView 的另一個子類)。 我如何處理兩個 NSView 的鼠標事件。

我想要實現的是以下內容:

我得到一個角色的 NSView,當我在該視圖內移動鼠標時,角色旋轉以跟隨鼠標。 里面同樣有一些項目,當鼠標懸停在一個項目上時我想顯示一些信息......如何實現這一點?

基本上:兩個類接收和響應鼠標懸停。

最好的問候克里斯蒂安

我想,您應該使用 CreateMouse Region 並處理鼠標事件,例如 mouseenter ,鼠標退出,

參考下面的 NSView 方法

addTrackingRect :提供 Rect ,您想在該區域捕獲鼠標事件,您將獲得以下事件,

鼠標按下

鼠標向上

鼠標輸入

鼠標退出

等等

以下是我們在 Swift 5 中的做法:

class TrackingAreaView: NSView {

   private var isMouseOverTheView = false {
      didSet {
         backgroundColor = isMouseOverTheView ? .red : .green
      }
   }
   private lazy var area = makeTrackingArea()
   private var backgroundColor: NSColor? {
      didSet {
         setNeedsDisplay(bounds)
      }
   }

   init() {
      super.init(frame: NSRect()) // Zero frame. Assuming that we are in autolayout environment.
      isMouseOverTheView = false
   }

   required init?(coder: NSCoder) {
      fatalError()
   }

   public override func updateTrackingAreas() {
      removeTrackingArea(area)
      area = makeTrackingArea()
      addTrackingArea(area)
   }

   public override func mouseEntered(with event: NSEvent) {
      isMouseOverTheView = true
   }

   public override func mouseExited(with event: NSEvent) {
      isMouseOverTheView = false
   }

   private func makeTrackingArea() -> NSTrackingArea {
      return NSTrackingArea(rect: bounds, options: [.mouseEnteredAndExited, .activeInKeyWindow], owner: self, userInfo: nil)
   }

   open override func draw(_ dirtyRect: NSRect) {
      if let backgroundColor = backgroundColor {
         backgroundColor.setFill()
         dirtyRect.fill()
      } else {
         super.draw(dirtyRect)
      }
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM