Cocoa 当父视图不是窗口时,是否有方法获取相对于最内部NSView的坐标?
我对NSView有疑问: 设想一个自定义视图,其中覆盖了mouseDown、mouseDrag和mouseUp方法,因此用户可以在屏幕上拖动点(NSRect)。要拖动它,我需要鼠标相对于当前视图的坐标。当视图的父视图是窗口时,这不是问题,但是当视图位于另一个视图中时,如何获取它们Cocoa 当父视图不是窗口时,是否有方法获取相对于最内部NSView的坐标?,cocoa,Cocoa,我对NSView有疑问: 设想一个自定义视图,其中覆盖了mouseDown、mouseDrag和mouseUp方法,因此用户可以在屏幕上拖动点(NSRect)。要拖动它,我需要鼠标相对于当前视图的坐标。当视图的父视图是窗口时,这不是问题,但是当视图位于另一个视图中时,如何获取它们 @implementation MyView - (id)initWithFrame:(NSRect)frame { self = [super initWithFrame:frame]; if (s
@implementation MyView
- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
pointXPosition = 200.0f;
pointYPosition = 200.0f;
locked = NO;
}
return self;
}
- (void) drawRect:(NSRect)rect {
NSRect point = NSMakeRect(pointXPosition, pointYPosition, 6.0f, 6.0f);
[[NSColor redColor] set];
NSRectFill(point);
}
- (void)mouseDown:(NSEvent *)theEvent {
NSPoint mousePos = [theEvent locationInWindow];
NSRect frame = [super frame];
CGFloat deltaX = mousePos.x - frame.origin.x - pointXPosition;
CGFloat deltaY = mousePos.y - frame.origin.y - pointYPosition;
if(sqrtf(deltaX * deltaX + deltaY * deltaY) < 100.0f)
locked = YES;
}
- (void)mouseUp:(NSEvent *)theEvent {
locked = NO;
}
- (void)mouseDragged:(NSEvent *)theEvent {
if(locked) {
NSPoint mousePos = [theEvent locationInWindow];
NSRect frame = [super frame];
CGFloat oldXPos = pointXPosition;
CGFloat oldYPos = pointYPosition;
pointXPosition = mousePos.x - frame.origin.x;
pointYPosition = mousePos.y - frame.origin.y;
CGFloat rectToDisplayXMin = MIN(oldXPos, pointXPosition);
CGFloat rectToDisplayYMin = MIN(oldYPos, pointYPosition);
CGFloat rectWidthToDisplay = MAX(oldXPos, pointXPosition) - rectToDisplayXMin;
CGFloat rectHeigthToDisplay = MAX(oldYPos, pointYPosition) - rectToDisplayYMin;
NSRect dirtyRect = NSMakeRect(rectToDisplayXMin,
rectToDisplayYMin,
rectWidthToDisplay + 6.0f,
rectHeigthToDisplay + 6.0f);
[self setNeedsDisplayInRect:dirtyRect];
}
}
@实现MyView
-(id)initWithFrame:(NSRect)帧{
self=[super initWithFrame:frame];
如果(自我){
点位置=200.0f;
点位置=200.0f;
锁定=否;
}
回归自我;
}
-(void)drawRect:(NSRect)rect{
NSRect point=NSMakeRect(pointXPosition,pointYPosition,6.0f,6.0f);
[[NSColor redColor]set];
NSRectFill(点);
}
-(无效)鼠标向下移动:(n事件*)事件{
n点鼠标点=[theEvent Location in Window];
NSRect frame=[超级帧];
CGFloat deltaX=mousePos.x-frame.origin.x-pointXPosition;
CGFloat deltaY=mousePos.y-frame.origin.y-pointYPosition;
如果(sqrtf(德尔泰*德尔泰+德尔泰*德尔泰)<100.0f)
锁定=是;
}
-(无效)鼠标点击:(n事件*)事件{
锁定=否;
}
-(无效)鼠标标记:(n事件*)事件{
如果(已锁定){
n点鼠标点=[theEvent Location in Window];
NSRect frame=[超级帧];
CGFloat oldXPos=点位置;
CGFloat oldYPos=点位置;
pointXPosition=mousePos.x-frame.origin.x;
pointYPosition=mousePos.y-frame.origin.y;
CGFloat rectToDisplayXMin=MIN(oldXPos,pointXPosition);
CGFloat recttodisplayimin=MIN(oldYPos,pointYPosition);
CGFloat rectdowthtodisplay=MAX(oldXPos,pointXPosition)-rectToDisplayXMin;
CGFloat RectHeightDisplay=MAX(oldYPos,pointYPosition)-RectToDisplayMin;
NSRect dirtyRect=NSMakeRect(rectToDisplayXMin,
直视显示,
矩形宽度显示+6.0f,
矩形高度显示+6.0f);
[self-setNeedsDisplayInRect:dirtyRect];
}
}
您不需要手动转换为本地坐标系。通过向视图发送convertPoint:fromView:
消息,可以将点转换为本地坐标系。将nil
作为参数发送到fromView
将转换视图父窗口中的点(无论在何处)。您还可以发送任何其他视图以从该空间转换坐标:
// convert from the window's coordinate system to the local coordinate system
NSPoint clickPoint = [self convertPoint:[theEvent locationInWindow] fromView:nil];
// convert from some other view's cooridinate system
NSPoint otherPoint = [self convertPoint:somePoint fromView:someSuperview];