如何基于拖动控件动态滚动NSScrollView

时间:2013-05-31 09:31:48

标签: macos cocoa cocoa-design-patterns

我有一个包含绘图的NSScrollView。 Drawing是NSView的子类,是一个放置目标。我有另一个名为dragBox的类,它是一个NSBox和一个拖动源。我希望能够动态更改绘图的大小,以适应将dragBox拖动到NSScrollView大小之外。目前,我在NSScrollView的内容视图中定义了一个自动滚动的“热区”。问题是当我删除dragBox时,它不会将它放在刚刚创建的虚拟空间中。它相对于视口的大小下降。这是代码。

@implementation Drawing


-(NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender // validate
{
NSLog(@"Updated");
_drawHintPoint = [sender draggedImageLocation];

if ([sender draggingLocation].x > [[self superview] bounds].size.width - 30)
{
    NSRect scrollRect = NSMakeRect(0,0, [self bounds].size.width + 30, [self bounds].size.height) ;
    [self setFrame:scrollRect];
    _drawHintPoint = NSMakePoint([self bounds].size.width + 30, [sender draggingLocation].y);
    [self scrollPoint:_drawHintPoint];

}





 return NSDragOperationEvery;

}





-(BOOL) prepareForDragOperation:(id<NSDraggingInfo>)sender
{
NSLog(@"Prepared");
return YES;

}
- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender {

NSLog(@"Move Box");
NSPoint pt = _drawHintPoint;
pt.x = pt.x - 32;
pt.y = pt.y - 32;
[[_ico box] setFrameOrigin:pt];
return YES;
}


- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender {
NSLog(@"Drag Entered");


_drawHintPoint = NSMakePoint(0, 0);



return NSDragOperationEvery;

} 

如何删除dragBox以使其在提供的虚拟空间中删除?

布鲁斯

1 个答案:

答案 0 :(得分:1)

解决!

在draggingUpdated中,这就是诀窍:

 _drawHintPoint = [[self superview] convertPoint:[sender draggingLocation] fromView:nil];

您需要将拖动位置转换为滚动视图中的坐标。上面一行中的[self superview]指的是NSClipRect。