如何在NSView中实现NSImage的拖动?

时间:2013-05-06 18:39:44

标签: cocoa nsview nsimage

我从未处理过很多关于NSView的事情,所以我对此感到很茫然。我有一个包含NSImage ivar的自定义类。我还有一个NSView的子类,它包含我的自定义类的实例数组。自定义类中的NSImage在创建时会在NSView的中心绘制。我需要能够NSImage自由地拖动NSView

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

-(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并使用它在视图周围自由移动它然而我甚至无法使它与一个对象一起工作而不知道如何正确实现这个想法。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分: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;
}