使用Tracking-Area对象

创建NSTrackingArea对象 

 一个NSTrackingArea对象定义一个鼠标的运动敏感区域,当鼠标进入(Enter)/移动(moves)/离开(exits)这个敏感区域,Application Kit 发送 mouse-tracking, mouse-moved, and cursor-update 消息。

当你创建一个nstrackingarea对象必须指定一个或多个选项。这些参数是配置跟踪区行为。一般分为三类:

1.消息类型

如果你要求处理mouseEntered: 和mouseExited:消息,你需要添加NSTrackingMouseEnteredAndExited参数

如果你要求处理 mouseMoved:消息,你需要添加NSTrackingMouseMoved参数

如果你要求处理 cursorUpdate:消息,你需要添加NSTrackingCursorUpdate参数

2.追踪鼠标活动范围(必须设置下面一种)

NSTrackingActiveWhenFirstResponder 跟踪第一响应者View的消息

NSTrackingActiveInKeyWindow 跟踪关键窗口中View的消息

NSTrackingActiveInActiveApp 跟踪活动App中View的消息

NSTrackingActiveAlways 跟踪活动App任何时候的消息

3.跟踪区行为的高级设置

NSTrackingAssumeInside: 如果你想跟踪处理鼠标首次离开tracking area的消息

NSTrackingInVisibleRect:你可以跟踪和关联View的可见区域相同的一个区域的消息

NSTrackingEnabledDuringMouseDrag:你可以要求用鼠标拖动进出跟踪区域产生mouseentered:mouseexited:事件

 

通过NSTrackingArea initWithRect:options:owner:userInfo:创建一个实例对象。创建对象后,你必须通过NSView addTrackingArea:方法关联一个View对象。list6-1在一个自定义View的实例initwithframe:方法中创建和添加一个NSTrackingArea对象;在这种情况下,每当窗口是key window时,这个自定义View接收Application Kit发送来的mouseEntered:mouseExited: mouseMoved:消息

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        trackingArea = [[NSTrackingArea alloc] initWithRect:eyeBox
            options: (NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveInKeyWindow )
            owner:self userInfo:nil];
        [self addTrackingArea:trackingArea];
    }
    return self;
}

 

管理跟踪对象updateTrackingAreas

1.当View添加到Window或者从window中删除,或者改变View在window中的位置,Application kit会重新计算Tracking-Area区域。

2. 当NSTrackingArea相关联的View不在可见区域时,Application kit无法重新计算Tracking-Area区域,除非NSTrackingArea在创建时设置NSTrackingInVisibleRect属性。

3. 如果不是自定义的View,不能在初始化中创建NSTrackArea对象,可以注册NSViewFrameDidChangeNotification消息,在消息处理函数中重创建NSTrackArea对象接收消息

- (void)updateTrackingAreas {
    NSRect eyeBox;
    [self removeTrackingArea:trackingArea];
    [trackingArea release];
    eyeBox = [self resetEye];
    trackingArea = [[NSTrackingArea alloc] initWithRect:eyeBox
        options: (NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveInKeyWindow)
        owner:self userInfo:nil];
    [self addTrackingArea:trackingArea];
}

 

Managing Cursor-Update Events

1.一般情况下,光标进入不同类型的视图中,会变化成不同的光标图像。比如本文视图需要一个I型光标。很多Application kit类中都定义自己独特的光标图像,您可以为自己的自定义视图的子类实例的指定一个不同的光标图像

2.你想在自定义NSResponder(NSView)的cursorUpdate:方法中改变光标图像,你必须在创建NSTrackingArea对象方法initWithRect:options:owner:userInfo:中添加NSTrackingCursorUpdate属性,然后把NSTrackingArea对象使用addTrackingArea:方法关联View对象。此后,此后,该鼠标在进入跟踪区域后,会产生一个nscursorupdate的事件;NSWindow对象会发送cursorupdate:事件到跟踪区域的所有者(关联的NSView对象),在NSView的cursorUpdate:方法中改变光标图像。

3. nscursorupdate的事件会在响应链中传递

4.注意:当鼠标退出跟踪区域时,没有必要设置光标图像使它恢复原样。因为 Application Kit自动帮你处理。

-(void)cursorUpdate:(NSEvent *)theEvent
{
    [[NSCursor crosshairCursor] set];
}

 

 相关学习

老谭的<OSX的MouseEntered和MouseExited事件检测>http://www.tanhao.me/pieces/1808.html/

转载于:https://www.cnblogs.com/zhu917/p/5262864.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值