0

我从来没有与 NSViews 打过交道,所以我对此感到茫然。我有一个包含NSImageivar 的自定义类。我还有一个NSView包含自定义类实例数组的子类。来自NSImage自定义类的 被绘制在NSView创建时的中心。我需要能够自由地拖动NSImageNSView

我已经实现了以下方法来开始:

-(void)mouseDown:(NSEvent *)theEvent
{
    [self beginDraggingSessionWithItems: /* I don't know what to put here */
                                  event:theEvent
                                 source:self];
}

我尝试将NSImage自定义类中的对象作为要拖动的项目放置在数组中,但引发异常。我也尝试在其中创建一个NSDraggingItem放置但它无法将对象写入粘贴板并引发异常。

-(void)draggingSession:(NSDraggingSession *)session willBeginAtPoint:(NSPoint)screenPoint
{
    NSLog(@"began");
}

-(void)draggingSession:(NSDraggingSession *)session movedToPoint:(NSPoint)screenPoint
{
    NSLog(@"moved");
}

-(void)draggingSession:(NSDraggingSession *)session endedAtPoint:(NSPoint)screenPoint operation:(NSDragOperation)operation
{
    NSLog(@"ended");
}

当我在我的子类周围单击并拖动鼠标时,这些方法会被正确调用,NSView但是在我可以移动对象之前它们是无用的。

我相信答案可能是NSDraggingItem为每个图像创建一个并使用它在视图中自由移动它们但是我无法让它与一个对象一起工作并且不知道如何正确实现这个想法。任何帮助表示赞赏。

4

1 回答 1

0

在这个问题上经历了很多头痛,但最终弄清楚了。而不是使用beginDraggingSessionWithItems:event:source我使用的dragImage:at:offset:event:pasteboard:source:slideBack:. 我跟踪视图中每个图像的坐标,并可以通过使用我写的以下方法来判断是否单击了特定图像mouseDown:

-(BOOL)clickedAtPoint:(NSPoint)point InsideRect:(NSRect)rect
{
    if ((point.x < (rect.origin.x + rect.size.width) &&
        point.y < (rect.origin.y + rect.size.height)) &&
        point.x > rect.origin.x && point.y > rect.origin.y) {
            return YES;
        }
    return NO;
}
于 2013-05-12T16:26:34.643 回答