创建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]; |
} |
相关学习