0

我有两种看法。1. 一个视图有一个带有图像的 NSImageViews 网格。2. 另一个视图有一个放置拖动图像的潜在位置网格。

我想我拖着工作。如果我从视图 1 中单击并拖动图像,它可以正常工作,但是当我尝试放置它时,源图像的路径是我桌面上的一个图像,它甚至不是我的项目的一部分。下面代码的结果是 CarryData = nil,但我用 NSLog 进行了一些测试,发现它正在发送项目外部的图像的路径,而不是我的桌面。

这是我实现的一些 D&D 协议方法。myDragState 只是我用来突出显示拖动当前悬停的网格空间的枚举。

在初始化...

[self registerForDraggedTypes:[NSImage imagePasteboardTypes]];
myDragState = dragStateNone;

然后是协议方法

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
{

    if ((NSDragOperationGeneric & [sender draggingSourceOperationMask]) == NSDragOperationGeneric)
    {
        myDragState = dragStateOver;
        [self setNeedsDisplay];

        return NSDragOperationGeneric;
    }
    else
    {
        return NSDragOperationNone;
    }
}

- (void)draggingExited:(id <NSDraggingInfo>)sender
{
    //turn off focus ring
    myDragState = dragStateExited;
    [self setNeedsDisplay];

}

- (void)draggingEnded:(id <NSDraggingInfo>)sender { }

- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender
{
    return YES;
}

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
{
    NSPasteboard *paste = [sender draggingPasteboard];
    //gets the dragging-specific pasteboard from the sender
    NSArray *types = [NSArray arrayWithObjects:NSTIFFPboardType, nil];
    //a list of types that we can accept
    NSString *desiredType = [paste availableTypeFromArray:types];
    NSData *carriedData = [paste dataForType:desiredType];

    if (nil == carriedData)
    {
        //the operation failed for some reason
        NSRunAlertPanel(@"Paste Error", @"Sorry, but the past operation failed", nil, nil, nil);

        myDragState = dragStateNone;
        [self setNeedsDisplay];

        return NO;
    }
    else
    {
        //the pasteboard was able to give us some meaningful data
        if ([desiredType isEqualToString:NSTIFFPboardType])
        {
            NSLog(@"TIFF");
            //we have TIFF bitmap data in the NSData object
            NSImage *newImage = [[NSImage alloc] initWithData:carriedData];
            [self setImage:newImage];

            myDragState = dragStateSet;
        }
        else
        {
            //this can't happen
            //NSAssert(NO, @"This can't happen");
            NSLog(@"Other type");
            myDragState = dragStateNone;
            [self setNeedsDisplay];
            return NO;
        }
    }
    //redraw us with the new image
    return YES;
}

- (void)concludeDragOperation:(id <NSDraggingInfo>)sender
{
    //re-draw the view with our new data
    [self setNeedsDisplay:YES];
}

- (void)drawRect:(NSRect)dirtyRect
{
    // Drawing code here.
    NSRect ourBounds = [self bounds];

    if (myDragState == dragStateSet)
    {
        NSImage *image = [self image];
        [super drawRect:dirtyRect];
        [image compositeToPoint:(ourBounds.origin) operation:NSCompositeSourceOver];
    }
    else if (myDragState == dragStateOver)
    {
        [[NSColor colorWithDeviceRed:1.0f green:1.0f blue:1.0f alpha:0.4f] set];
        [NSBezierPath fillRect:ourBounds];
    }
    else {
        //draw nothing
    }

}

编辑:所以我想通了。问题实际上出在源头上。我没有正确地将它复制到 PBoard。我的代码是:

NSPasteboard *zPasteBoard = [NSPasteboard pasteboardWithName:NSDragPboard]; 
[zPasteBoard declareTypes:[NSArray arrayWithObject:NSTIFFPboardType] owner:self]; 
[zPasteBoard setData:[tileImageView.image TIFFRepresentation] forType:NSTIFFPboardType];

现在,当图像显示时,我得到了一些奇怪的效果。当图像被放置在目标图像视图中时,它们正在调整大小,但更大的可拖动版本也仍然出现。所以,我在图像视图上得到了两个图像。

4

0 回答 0