Drag & Drop создание перетаскивания изображения - PullRequest
1 голос
/ 07 июля 2011

Я реализую перетаскивание для customView;этот customView является подклассом NSView и включает в себя некоторые элементы.Когда я запускаю операцию перетаскивания, dragImage - это просто прямоугольное серое поле того же размера, что и в customView.

Это код, который я написал:

-(void) mouseDragged:(NSEvent *)theEvent
{
    NSPoint downWinLocation = [mouseDownEvent locationInWindow];
    NSPoint dragWinLocation = [theEvent locationInWindow];

    float distance = hypotf(downWinLocation.x - dragWinLocation.x, downWinLocation.y - downWinLocation.x);
    if (distance < 3) {
        return;
    }

    NSImage *viewImage = [self getSnapshotOfView];
    NSSize viewImageSize = [viewImage size];
    //Get Location of mouseDown event
    NSPoint p = [self convertPoint:downWinLocation fromView:nil];

    //Drag from the center of image
    p.x = p.x - viewImageSize.width / 2;
    p.y = p.y - viewImageSize.height / 2;

    //Write on PasteBoard
    NSPasteboard *pb = [NSPasteboard pasteboardWithName:NSDragPboard];
    [pb declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType]
               owner:nil];
    //Assume fileList is list of files been readed
    NSArray *fileList = [NSArray arrayWithObjects:@"/tmp/ciao.txt", @"/tmp/ciao2.txt", nil];
    [pb setPropertyList:fileList forType:NSFilenamesPboardType];

    [self dragImage:viewImage at:p offset:NSMakeSize(0, 0) event:mouseDownEvent pasteboard:pb source:self slideBack:YES];
}

И этоФункция, которую я использую для создания снимка:

- (NSImage *) getSnapshotOfView
{
    NSRect rect = [self bounds] ;

    NSImage *image = [[[NSImage alloc] initWithSize: rect.size] autorelease];

    NSRect imageBounds;
    imageBounds.origin = NSZeroPoint;
    imageBounds.size = rect.size;

    [self lockFocus];
    NSBitmapImageRep *rep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:imageBounds];
    [self unlockFocus];

    [image addRepresentation:rep];
    [rep release];

    return image;
}

Это изображение операции перетаскивания в моем customView (изображение со значком и надписью «перетащите меня») DragDrop

Почему мой dragImage это просто серый ящик?

1 Ответ

4 голосов
/ 07 июля 2011

На скриншоте IB в вашем комментарии это выглядит так, как будто ваш вид поддерживается слоем.Представления со слоями опираются на собственную графическую область, которая отделена от обычного хранилища окон.

Этот код:

[self lockFocus];
NSBitmapImageRep *rep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:imageBounds];
[self unlockFocus];

Эффективно считывает пиксели из хранилища окон.Так как ваш вид поддерживается слоем, его содержимое не передается.

Попробуйте это без просмотра слоя назад.

...