鼠标移到NSView子视图中

问题描述 投票:1回答:2

我有一个处理鼠标事件的NSView子类,在这个NSView里面我有一个子视图(它是NSView的另一个子类)。我怎样才能处理两个NSViews的鼠标事件。

我想实现的是下面的目标。

在一个NSView中,我得到了一个字符,当我在该视图中移动鼠标时,该字符就会跟着鼠标旋转,在该视图中还有一些项目,当鼠标悬停在一个项目上时,我想显示一些信息......如何实现这一点?

基本上:两个类接收并响应鼠标悬停。

最佳的祝愿Kristian

objective-c cocoa mouseevent nsview
2个回答
2
投票

我想,你应该用CreateMouse Region来处理鼠标事件,比如鼠标进入,鼠标退出。

参考以下NSView的方法

addTrackingRect : 提供你想捕捉鼠标事件的区域,你会得到以下事件。

鼠标点击

鼠标上移

鼠标输入

鼠标退出

诸如此类


0
投票

下面是我们在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)
      }
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.