Objective c 可可画;锁;特殊事件上的鼠标

Objective c 可可画;锁;特殊事件上的鼠标,objective-c,cocoa,graphics,drawing,Objective C,Cocoa,Graphics,Drawing,在上一个关于Cocoa中图形的问题的帮助下,我实现了一些基本形状,以及拖动/调整大小 所以,现在我想弄清楚,当一个形状被调整大小,它自动适应旁边另一个形状的大小,然后“锁定”鼠标一段时间时,如何创建一个类似于注释记号的效果 第一次尝试是使用延迟函数,如 NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 0.5 ]; [NSThread sleepUntilDate:future]; 对所需事件作出反应(例如,形状宽度=高度)。但这并没

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

所以,现在我想弄清楚,当一个形状被调整大小,它自动适应旁边另一个形状的大小,然后“锁定”鼠标一段时间时,如何创建一个类似于注释记号的效果

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

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

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

对于“捕捉到指南”,我认为您实际上不希望光标停止。只是在距离目标很小的范围内,调整大小应该停止对光标移动的反应

我认为,这一解决方案或多或少是你想要的。本质上,当你足够接近导向时,你只需将点的坐标更改为导向的坐标。因此,基于我在前面问题中发布的示例代码,这将成为视图的
鼠标标记:
,以及
鼠标悬停:
。如果希望点仅在鼠标向上时捕捉,则可以将新签出保留在
mouseDragged:
中,这是一种不同但同样有效的行为

如果要匹配矩形的边,您可能会发现,如
NSMaxX
NSMaxY
,它们很有用

- (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];
}
-(void)鼠标标记:(NSEvent*)事件{
如果(!currMovingDot)返回;
NSPoint spot=[自转换点:[事件位置inWindow]
fromView:nil];
spot.x=MAX(0,MIN(spot.x,self.bounds.size.width));
spot.y=MAX(0,MIN(spot.y,self.bounds.size.height));
//寻找中心线接近的点
//当前鼠标位置
用于(点*点中点){
如果(点==当前移动点){
//别急着自言自语!把这件事忘了吧
//“捕捉到网格”效果。
继续;
}
//SNAP#u DIST在什么地方定义
//10岁以下的人似乎是个不错的选择

if(abs(点x-点位置x)你肯定不想睡觉。不过,我不能100%确定我的想法是否正确--让我描述一下我正在画的东西。我们有两个相邻的正方形。左边的正方形A稍微小一些,与右边的正方形B相隔一小段距离。当我们向下和向上拖动正方形A的右下调整大小手柄时s B,如果手柄碰到B的左边缘和下边缘定义的任何一条线,手柄将“暂停”。例如,用户可以拖动鼠标,但手柄不会移动,A暂时不会继续调整大小。“捕捉到辅助线”,换句话说?@Josh:在修复此问题之前没有睡眠…好的,可能有点睡眠;)“捕捉到辅助线”这是一个问题,但这并不考虑“暂停”的效果。所以它完全是舍入和提供正确的鼠标行为(即不锁定)。。谢谢Josh,一如既往的帮助。@macs:不客气,这是我的荣幸。顺便说一句,我一直在玩矩形边缘匹配的游戏;这可能比乍一看要复杂一些。祝你好运!我注意到了。如果用户不想使用此功能,我还想避免让他/她按某个键。但这似乎会这是唯一的方法。这个问题的主要目的也是为了避免为圆或正方形编写一个类,我认为最好在应用程序的帮助下生成一个正方形。如果我有一个好的基础,我可以通知你。这个会变得很好:)