2009-09-24 106 views
0

我有一个集合视图,我已将其分类为允许通过拖放重新排列集合视图项目的顺序。即树立pasterboard我拖码是目前的mouseDragged:如何帮助防止我的用户在Cocoa中意外启动拖动?

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

    if(!dragInProgress) { 
     dragInProgress = YES; 

     NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard];   

      ... setup pboard, declare types, setData ... 
      ... create drag image .... 

     [self dragImage: image 
         at: position 
        offset: NSZeroSize 
        event: aEvent 
       pasteboard: pboard 
        source: self 
       slideBack: YES]; 
    } 
} 

我想只启动一拖,如果用户已经拖了一定的长度,所以他们不小心启动阻力。在Cocoa中是否有这样的设置,或者是否需要将此代码移动到mouseMoved:并检查拖动开始位置和鼠标当前位置之间的距离?

回答

2

mouseDown:中,请记住鼠标掉落的位置(locationInWindow)。在mouseDragged:中,从鼠标拖动事件的位置中减去鼠标向下事件的位置,并将该差值与由kMouseParamsDragInitiation选择器返回的大小(HIMouseTrackingGetParameters)进行比较。

+0

您在mouseDown中记录locationInWindow并将其与mouseDragged上的locationInWindow进行比较的解决方案奏效。虽然我没有看到HIMouseTrackingGetParameters和kMouseParamsDragInitiation在哪里发挥作用。我只是使用c距离函数来计算距离并进行比较。 – Austin 2009-09-25 20:17:11

+0

该功能为您提供正确的最小距离来启动拖动。如果用户没有移动这个距离,他们只是按住鼠标按钮。 – 2009-09-25 21:45:13