Objective c 当使用initWithRect:[self-bounds]和[self-frame]初始化时,NSTrackingArea会产生不同的结果

Objective c 当使用initWithRect:[self-bounds]和[self-frame]初始化时,NSTrackingArea会产生不同的结果,objective-c,cocoa,Objective C,Cocoa,---------问题1---------- 可能我不完全理解frame对象(或者可能它在我的上下文中没有正确创建),但是当我尝试实现鼠标事件时,我遇到了调用: trackingArea=[ [NSTrackingArea alloc] initWithRect:[self frame] options:(NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveInKeyWindow) owner:self

---------问题1---------- 可能我不完全理解frame对象(或者可能它在我的上下文中没有正确创建),但是当我尝试实现鼠标事件时,我遇到了调用:

trackingArea=[ [NSTrackingArea alloc] initWithRect:[self frame] options:(NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveInKeyWindow) owner:self userInfo:nil ];
导致不正确的跟踪区域(只有右上角有效)-查看问题时,我发现“帧”从右上角的某个位置开始。此调用是在定义为以下内容的重载initWithFrame中进行的:

glView = [ [ Lesson17View alloc ] initWithFrame:[ glWindow frame ]
colorBits:16 depthBits:16 fullscreen:FALSE ];
其中glView是NSOpenGLView的子类。上述调用是在awakeFromNib中进行的,glWindow定义为:

glView = [ [ Lesson17View alloc ] initWithFrame:[ glWindow frame ]
colorBits:16 depthBits:16 fullscreen:FALSE ];
IBNSWindow*glWindow

当我用frame替换边界时,我的应用程序工作了——frame变量发生了什么

---------问题2----------

我的第二个问题涉及如何处理鼠标事件并正确地重新绘制openGL视图-假设我有:

- (void) mouseMoved:(NSEvent *)theEvent
{
NSPoint location=[self convertPoint:[theEvent locationInWindow] fromView:nil];
// send NSPoint to a printGL function I have that uses texture maps to display text?
}
我猜我不应该将其发送给在openGL视图中呈现某些内容的函数(因为这不起任何作用-猜测是因为每当我使用drawRect时,我在鼠标事件期间绘制的任何内容都会被清除)。目前,我的所有绘图都是在drawRect中执行的(包含一系列openGL调用)-此时进行什么合适的调用


或者我应该设置一个标志(同时设置一个实例变量NSPoint)为true,只允许在mouseMoved事件上调用printGL(我知道-我将使用mouseEntered/Exited函数,但现在我正在尝试对此进行处理)。

视图的框架是视图在其superview中的位置。这意味着最重要的是,除非视图的原点位于其superview原点的正上方(即在
{0,0}
),否则帧矩形将偏移该量

视图的边界是视图内的坐标。除非对视图的坐标系应用了某些变换,否则边界原点将始终位于
{0,0}

那么,为什么这会对你的情况产生影响呢?例如,rect被解释为跟踪区域所有者坐标系中的坐标。所有者边界位于其坐标系中,而框架位于所有者superview的坐标系中。所以你给了跟踪区域一个错误坐标系的矩形

我强烈建议你阅读这本书。它解释了所有这些以及更多。在编写UI代码时,您需要了解Cocoa视图系统的许多细微细节


(对于第二个问题:要告诉视图重新绘制,请发送它
[视图设置需要显示:是]

您可能应该将其分为两个不同的问题。感谢视图编程指南-我仍然不明白为什么我的glView框架的原点位于超级视图的右上角(它是用super view的框架初始化的-所以我不明白为什么这两个值不相同)同样-我的mouseMoved方法中不应该有任何opengl命令(或调用opengl),对吗?我应该设置调用drawRect时将在中使用的值(也就是说,一个根据鼠标位置绘制东西的标志,它将被查询)。好吧,我想我回答了我自己的问题一点-glView有帧偏移的原因是因为superview被偏移了(这是主NSWindow实例)。。。