gpt4 book ai didi

objective-c - 拖动 View

转载 作者:太空狗 更新时间:2023-10-30 03:26:10 27 4
gpt4 key购买 nike

我有一个 NSView,我将其添加为另一个 NSView 的 subview 。我希望能够将第一个 NSView 拖到父 View 周围。我有一些代码可以部分工作,但是 NSView 在我的鼠标拖动中沿 Y 轴的相反方向移动时出现问题。 (即我向下拖动,向上拖动,反之亦然)。

这是我的代码:

// -------------------- 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;
}

View 翻转了,尽管我将其改回默认值,但似乎没有什么不同。我究竟做错了什么?

最佳答案

解决此问题的最佳方法是从对坐标空间的扎实理解开始。

首先,理解当我们谈论窗口的“框架”时,它是在 superview 的坐标空间中,这一点很重要。这意味着调整 View 本身的翻转度实际上不会产生任何影响,因为我们没有在 View 本身内部更改任何内容。

但是您认为翻转在这里很重要的直觉是正确的。

默认情况下,您输入的代码似乎可以正常工作;也许您的 super View 已翻转(或未翻转),并且它位于与您预期不同的坐标空间中。

与其只是随机翻转和取消翻转 View ,不如将您正在处理的点转换为已知坐标空间。

我已经编辑了您上面的代码以始终转换为 super View 的坐标空间,因为我们正在使用框架原点。如果您的可拖动 View 放置在翻转或非翻转的 super View 中,这将起作用。

// -------------------- MOUSE EVENTS ------------------- \\ 

- (BOOL) acceptsFirstMouse:(NSEvent *)e {
return YES;
}

- (void)mouseDown:(NSEvent *) e {

// Convert to superview's coordinate space
self.lastDragLocation = [[self superview] convertPoint:[e locationInWindow] fromView:nil];

}

- (void)mouseDragged:(NSEvent *)theEvent {

// We're working only in the superview's coordinate space, so we always convert.
NSPoint newDragLocation = [[self superview] convertPoint:[theEvent locationInWindow] fromView:nil];
NSPoint thisOrigin = [self frame].origin;
thisOrigin.x += (-self.lastDragLocation.x + newDragLocation.x);
thisOrigin.y += (-self.lastDragLocation.y + newDragLocation.y);
[self setFrameOrigin:thisOrigin];
self.lastDragLocation = newDragLocation;
}

此外,我建议重构您的代码以简单地处理原始鼠标按下位置和指针的当前位置,而不是处理 mouseDragged 事件之间的增量。这可能会导致意外结果。

而是简单地存储拖动 View 的原点和鼠标指针之间的偏移量(鼠标指针在 View 内的位置),并将框架原点设置为鼠标指针的位置减去偏移量。

这里有一些补充阅读:

Cocoa Drawing Guide

Cocoa Event Handling Guide

关于objective-c - 拖动 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7195835/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com