我从来没有和NSViews打过交道,所以我对此感到困惑。我有一个包含NSImage ivar的自定义类。我还有一个NSView的子类,其中包含我的自定义类的实例数组。自定义类中的NSImage在创建时绘制在NSView的中心。我需要能够在NSView中自由地拖动该NSImage。
我已经实现了以下方法来开始:
-(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,并使用它在视图中自由移动它们,但是我无法让它与一个对象一起工作,也不知道如何正确地实现这个想法。任何帮助都是非常感谢的。
发布于 2013-05-13 00:26:35
在这个问题上经历了很多令人头疼的事情,但最终还是弄明白了。我使用的是dragImage:at:offset:event:pasteboard:source:slideBack:而不是beginDraggingSessionWithItems:event:source。我跟踪视图中每个图像的坐标,并通过使用我在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;
}https://stackoverflow.com/questions/16405038
复制相似问题