Cocoa绘图,“锁定”鼠标在特殊事件上

3

在上一篇有关Cocoa绘图的问题的帮助下,我已经实现了一些基本形状,并且可以进行拖动/调整大小。

因此,现在我正在尝试弄清楚如何创建一个效果,就像在Keynote中当一个形状被调整大小时,它会自动适应旁边的另一个形状的大小,然后“锁定”鼠标一段时间。

第一次尝试是使用延迟函数,例如

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

在期望事件发生时(例如形状宽度==高度),对其做出反应。但这并没有产生期望的效果,因为整个应用程序会在指定的时间内冻结。此外,我认为用户不会将其视为“您已达到特定尺寸”的提示。仅在事件发生时显示指南也不是解决方案,因为一旦选择形状,指南就会显示。


你绝对不想睡觉。虽然我不确定自己是否有正确的想法,但让我描述一下我的想象。我们有两个相邻的正方形。左边的A正方形稍微小一些,并且与右边的B正方形之间隔了一段距离。当我们将A正方形的右下角调整大小手柄向下并向B正方形拖动时,如果它碰到B正方形左侧和下侧定义的线条之一,手柄会“暂停”。也就是说,用户可以拖动鼠标,但手柄不会移动,A也不会继续调整大小,暂停一会儿。换句话说,“吸附到参考线”? - jscs
@Josh:在这个问题解决之前不睡觉...好吧,也许可以稍微睡一下 ;) “对齐参考线”,你做得很好。这里有一个关于此的问题链接,但是它没有考虑“暂停”效果。 - Sebastian Dressler
1个回答

4
对于对齐参考线,我认为你并不希望光标停止移动,只是在接近目标时,调整大小应该停止对光标移动的反应,在一个小范围内。
解决方案可以参考这个问题。基本上,当你靠近参考线时,就将点的坐标更改为参考线的坐标。所以,在你之前的问题中发布的示例代码的基础上,这就成为了你视图的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];
}

所以这完全是关于舍入和提供正确的鼠标行为(即不要锁定)。谢谢Josh,一如既往的有帮助。 - Sebastian Dressler
@macs:不用谢,很高兴能帮忙。顺便说一下,我在尝试匹配矩形边缘时遇到了些许困难;这可能比起初看起来要棘手一些。祝好运! - jscs
我注意到了。我也想避免用户在不想使用该功能时按键。但似乎这将是唯一的方法。提出问题的主要意图也是为了避免编写圆形或正方形类,我认为最好使用应用程序的帮助来生成正方形。如果我有一个良好的基础,我会通知您。这将变得非常棒 :) - Sebastian Dressler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接