In a Cocoa-based App i’m having a canvas for drawing, inherited from NSView, as well as a rectangle, also inherited from NSView. Dragging the rectangle around inside of the canvas is no problem:
-(void)mouseDragged:(NSEvent *)theEvent {
NSPoint myOrigin = self.frame.origin;
[self setFrameOrigin:NSMakePoint(myOrigin.x + [theEvent deltaX],
myOrigin.y - [theEvent deltaY])];
}
Works like a charm. The issue i’m having now: How can i prevent the rectangle from being moved outside the canvas?
So, first of all i would like to fix this just for the left border, adapting the other edges afterwards. My first idea is: “check whether the x-origin of the rectangle is negative”. But: once it is negative the rectangle can’t be moved anymore around (naturally). I solved this with moving the rectangle to zero x-offset in the else-branch. This works but it’s … ugly.
So i’m little puzzled with this one, any hints? Definitely the solution is really near and easy. That easy, that i cannot figure it out (as always with easy solutions ;).
Regards
Macs
I’d suggest not using the
deltaXanddeltaY; try using the event’s location in the superview. You’ll need a reference to the subview.You’d do essentially the same bounds checking in
mouseUp:.UPDATE: You should also have a look at the View Programming Guide, which walks you through creating a draggable view: Creating a Custom View.
Sample code that should be helpful, though not strictly relevant to your original question:
In DotView.m:
Dot.h
Dot.m
As you can see, the
Dotclass is very lightweight, and uses bezier paths to draw. The superview can handle the user interaction.