可可绘图,“锁定”鼠标特殊事件

时间:2011-04-30 19:39:35

标签: objective-c cocoa graphics drawing

在Cocoa中关于绘图的最后一个问题的帮助下,我实现了一些基本的形状,以及拖动/调整大小。

所以,现在我想弄清楚,当一个形状被调整大小并且它自动适合它旁边的另一个形状的大小然后“锁定”鼠标一点时,如何在Keynote中创建一个效果时间。

首次尝试使用延迟功能,如

NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 0.5 ];
[NSThread sleepUntilDate:future];

对期望的事件(例如,形状宽度==高度)作出反应。但这不会产生预期的效果,因为整个应用程序冻结了指定的时间。除此之外,我认为,用户不会将其识别为“你已达到特殊尺寸”。仅在事件中显示指南不是解决方案,因为一旦选择了形状,就会显示指南。

1 个答案:

答案 0 :(得分:4)

对于对齐指南,我认为您实际上并不希望光标停止。只是调整大小应该停止对目标的一小部分范围内的光标移动作出反应。

我认为that other question中的解决方案或多或少都是您想要的。基本上,当您足够接近指南时,您只需将点的坐标更改为指南的坐标。因此,基于我在之前的问题中发布的示例代码,这将成为您的视图mouseDragged:mouseUp:。如果您希望该点仅在鼠标向上捕捉,则可以将新检查保留在mouseDragged:之外,这是一种不同但同样有效的行为。

如果您匹配矩形的边缘,您可能会发现Foundation Rect Functions,如NSMaxXNSMaxY,非常有用。

- (void)mouseDragged:(NSEvent *)event {
    if( !currMovingDot ) return;
    NSPoint spot = [self convertPoint:[event locationInWindow] 
                             fromView:nil];
    spot.x = MAX(0, MIN(spot.x, self.bounds.size.width));
    spot.y = MAX(0, MIN(spot.y, self.bounds.size.height));

    // Look for Dots whose centerlines are close to
    // the current mouse position
    for( Dot * dot in dots ){
        if (dot == currMovingDot) {
            // Don't snap to myself! Leaving this out causes
            // "snap to grid" effect.
            continue;
        }
        // Where SNAP_DIST is #define'd somewhere
        // something under 10 seems to be a good value
        if( abs(spot.x - dot.position.x) <= SNAP_DIST ){
            spot.x = dot.position.x;
        }
        if( abs(spot.y - dot.position.y) <= SNAP_DIST ){
            spot.y = dot.position.y;
        }
    } 


    currMovingDot.position = spot;
    [self setNeedsDisplay:YES];
}