cocoa - polares - como ingresar coordenadas en autocad 2014
¿Hay alguna manera de obtener coordenadas relativas al NSView más interno cuando el padre no es la ventana? (1)
Tengo preguntas sobre NSView:
Imagine una Vista personalizada donde los métodos mouseDown, mouseDrag y mouseUp son anulados para que el usuario pueda arrastrar un punto (NSRect) en la pantalla. Para arrastrarlo, necesito las coordenadas del mouse relativas a la vista actual. Esto no es un problema cuando el padre de la vista es la ventana, pero ¿cómo los obtengo cuando la vista está dentro de otra vista?
@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];
}
}
No necesita convertir manualmente al sistema de coordenadas local. Puede convertir el punto en el sistema de coordenadas local enviando el convertPoint:fromView:
a su vista. Enviar nil
como parámetro a fromView
convertirá el punto de la ventana primaria de la vista (donde sea). También puede enviar cualquier otra vista para obtener las coordenadas convertidas desde ese espacio también:
// 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];