我正在开发一个具有自定义视图的应用程序,用户可以在视图周围移动对象。他们可以拿起它们并将它们放在不同的地方,我希望光标可以根据它们可以拾取的物体以及它们放在哪里来改变。
我正在使用tracking areas,但为了维护正确的游标,我正在使用跟踪区域通知并为任何鼠标移动设置光标。
这很好用,我有我的解决方案,但是我想知道是否经常调用[NSCursor set]
或者如果AppKit
能够毫无问题地处理此问题而导致性能下降?/ p>
更新:根据Rob Keniger的建议,我已对应用程序进行了分析,但未发现更改游标所花费的实际时间。为了安全起见,我实现了一个简单的宏来保持当前的游标状态,并且只在必要时设置它,如下所定义:
// Values for _currentCursor
#define CURRENT_CURSOR_UNKNOWN 0
#define CURRENT_CURSOR_ARROW 1
#define CURRENT_CURSOR_POINTINGHAND 2
#define CURRENT_CURSOR_OPENHAND 3
#define CURRENT_CURSOR_CLOSEDHAND 4
#define CURRENT_CURSOR_NOENTRY 5
#define CURRENT_CURSOR_HIDDEN 0x80
#define SET_CURSOR(current, cursor) \
if ((_currentCursor & CURRENT_CURSOR_HIDDEN) == 0 && _currentCursor != current) \
{ \
[cursor set]; \
_currentCursor = current; \
}
您可以在代码中调用它:
SET_CURSOR(CURRENT_CURSOR_CLOSEDHAND, [NSCursor closedHandCursor]);
答案 0 :(得分:1)
首先,关于性能,你测试过吗? Apple提供了出色的分析工具。使用Instruments,您可以非常快速地了解光标更改调用导致的性能损失程度。不要猜,简介。
其次,为什么不使用mouseEntered:
和mouseExited:
事件来更改光标,而不是mouseMoved:
事件?大多数情况下,光标需要更改的唯一时间是鼠标进入或退出跟踪区域,对吗?
如果你确实需要更细粒度的控制(例如,如果你需要选择一个非矩形对象,我可能会看到这种情况),并且如果光标改变调用结果是昂贵的(我非常怀疑它,你应该只存储光标的当前状态,并在mouseMoved:
事件中检查光标是否需要更改,然后再更改它。
然而,我怀疑你已经做的事情会变得很好,因为NSCursor
如果用与当前光标相同的光标调用[NSCursor set]
,可能会进行类似的检查光标。