【问题标题】:Mouse over in a NSView subview将鼠标悬停在 NSView 子视图中
【发布时间】:2011-01-10 09:54:02
【问题描述】:

我有一个处理鼠标事件的 NSView 子类,在那个 NSView 里面我有一个子视图(这是 NSView 的另一个子类)。我如何处理两个 NSView 的鼠标事件。

我想要达到的目标如下:

我得到一个角色的 NSView,当我在该视图内移动鼠标时,角色旋转以跟随鼠标。在同一个里面有一些项目,当鼠标悬停在一个项目上时我想显示一些信息......如何实现这一点?

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

最好的问候 克里斯蒂安

【问题讨论】:

    标签: objective-c cocoa mouseevent nsview


    【解决方案1】:

    我想,你应该玩 CreateMouse Region 并处理鼠标事件,如 mouseenter ,鼠标退出,

    参考下面的NSView方法

    addTrackingRect : 提供 Rect 你想捕捉鼠标事件的地方 对于该地区,您将获得以下事件,

    鼠标按下

    鼠标移动

    鼠标进入

    鼠标退出

    等等

    【讨论】:

    • 感谢您的回复,但我决定使用 Cocos2D 解决了我所有的问题 =D
    【解决方案2】:

    这是我们在 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)
          }
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多