Ziehen Sie die Ansicht
Ich habe eine NSView
dem ich bin hinzufügen, als ein sub-view von anderen NSView
. Ich möchte in der Lage zu ziehen die ersten NSView
um die übergeordnete Ansicht. Ich habe einige code, der teilweise funktioniert, aber es gibt ein Problem mit der NSView
bewegt sich in die entgegengesetzte Richtung auf der Y-Achse von meiner Maus. (d.h. ich ziehen Sie nach unten, es geht nach oben, und die inverse von, dass).
Hier ist mein code:
//-------------------- MOUSE EVENTS ------------------- \\
- (BOOL) acceptsFirstMouse:(NSEvent *)e {
return YES;
}
- (void)mouseDown:(NSEvent *) e {
//get the mouse point
lastDragLocation = [e locationInWindow];
}
- (void)mouseDragged:(NSEvent *)theEvent {
NSPoint newDragLocation = [theEvent locationInWindow];
NSPoint thisOrigin = [self frame].origin;
thisOrigin.x += (-lastDragLocation.x + newDragLocation.x);
thisOrigin.y += (-lastDragLocation.y + newDragLocation.y);
[self setFrameOrigin:thisOrigin];
lastDragLocation = newDragLocation;
}
Wird die Ansicht umgedreht, obwohl ich das geändert, wieder zurück auf den Standard, und es scheint nicht, einen Unterschied zu machen. Was mache ich falsch?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der beste Weg, dieses problem, indem beginnend mit ein solides Verständnis von Koordinatenräumen.
Erste, ist es wichtig zu verstehen, dass wenn wir sprechen über die "frame", ein Fenster, es befindet sich im Koordinatenraum der superview. Dies bedeutet, dass die Anpassung der flippedness der Ansicht selbst wird nicht wirklich einen Unterschied machen, weil wir noch nicht geändert, alles, was in der Ansicht selbst.
Aber Ihre intuition, dass die flippedness wichtig ist hier die richtige ist.
Standardmäßig wird dein code so eingegeben, wie es scheint, funktionieren würde; vielleicht ist Ihr superview gekippt wurde (oder auch nicht gekippt), und es ist in einem anderen Koordinatenraum, als Sie erwarten.
Statt einfach nur Umklappen und unflipping Ansichten zufällig, ist es am besten konvertieren Sie die Punkte, die Sie zu tun haben, in einem bekannten Raum koordinieren.
Ich habe bearbeitet deinem obigen code immer konvertieren in das superview Koordinatenraum, denn wir arbeiten mit der frame-Herkunft. Dies funktioniert, wenn Ihr draggable view befindet sich in einer umgedreht oder nicht umgedreht superview.
Darüber hinaus würde ich empfehlen, refactoring Ihres Codes, um einfach befassen sich mit der original-Maus-unten-Position und der aktuellen Position der Zeiger, anstatt sich mit den deltas zwischen mouseDragged-events. Dies könnte zu unerwarteten Ergebnissen führen, die Linie nach unten.
Stattdessen einfach speichern Sie den Abstand zwischen der Herkunft von gezogenen anzeigen und den Mauszeiger (in dem der Mauszeiger in der Ansicht), und stellen Sie die frame-Ursprung und der Position des Mauszeigers, minus dem offset.
Hier ist einige zusätzliche Lektüre:
Kakao-Zeichnen-Anleitung
Kakao-Event Handling Guide
Denke ich, sollten Sie berechnen sich je nach position der Maus, verursachen, laut meinem test,wird es mehr glatt.Denn Die Art und Weise, wie Sie unten nur die position innerhalb der Anwendung Fenster Koordinatensystem:
Was ich Vorschlage, ist so etwas wie dieses:
andere codes sind genau das gleiche.