Draggable CALayer - PullRequest
       3

Draggable CALayer

3 голосов
/ 26 февраля 2011

Есть ли способ сделать CALayer перетаскиваемым пользователем? Если да, то как?

(в какао - Mac)

Ответы [ 2 ]

4 голосов
/ 26 февраля 2011

Слои не могут сами получать события мыши. Вам нужно будет выполнить обработку событий в контроллере представления или представления, содержащем слой.

Если на слое возникает событие mouseDragged: (см. -[CALayer hitTest:] и -[CALayer containsPoint:], чтобы проверить это), соответственно отрегулируйте значение position для слоя. Возможно, вы захотите отключить неявную анимацию, чтобы слой следовал за указателем мыши сразу (а не немного отставал из-за анимации свойства position):

[CATransaction begin];
[CATransaction setDisableActions:YES];
layer.position = ...;
[CATransaction commit];
1 голос
/ 26 февраля 2011

Я попытался создать окно с помощью кода и добавить в него CALayer, но я не понимаю, почему оно не отображается.

NSRect rect = NSZeroRect;
    rect.size = NSMakeSize( SSRandomFloatBetween( 300.0, 200.0 ), SSRandomFloatBetween( 300.0, 200.0 ));

    NSWindow *newWin = [[NSWindow alloc] initWithContentRect:rect styleMask:NSBorderlessWindowMask backing:NSWindowBackingLocationDefault defer:YES];
    [newWin setBackgroundColor: [NSColor clearColor]];
    [newWin setOpaque:NO];
    [newWin setIgnoresMouseEvents:NO];
    [newWin setMovableByWindowBackground:YES];
    [newWin makeKeyAndOrderFront:self];

    [[newWin contentView] setWantsLayer:YES];

    NSRect contentFrame = [[newWin contentView] frame];
    CALayer *newWinLayer = [CALayer layer];
    newWinLayer.frame = NSRectToCGRect(contentFrame);

    layer.backgroundColor=CGColorCreateGenericGray(0.0f, 0.5f);
    layer.borderColor=CGColorCreateGenericGray(0.756f, 0.5f);
    layer.borderWidth=5.0;

        // Calculate random origin point
    rect.origin = SSRandomPointForSizeWithinRect( rect.size, [window frame] );

        // Set the layer frame to our random rectangle.
    layer.frame = NSRectToCGRect(rect);
    layer.cornerRadius = 25.0f;
  [newWinLayer addSublayer:layer];

Окно связано с большим окном с полупрозрачным(закрашено черным) окно, размер которого изменяется, чтобы заполнить экран.

Я сделал окно перетаскиваемым, но почему в окне не отображается CALayer?

...