首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绘制可可,“锁定”鼠标在特殊事件上

绘制可可,“锁定”鼠标在特殊事件上
EN

Stack Overflow用户
提问于 2011-05-01 03:39:35
回答 1查看 1K关注 0票数 3

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

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

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

代码语言:javascript
复制
NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 0.5 ];
[NSThread sleepUntilDate:future];

在期望的事件上做出反应(例如形状、宽度、==高度)。但这并没有达到预期的效果,因为整个App会在指定的时间内冻结。除此之外,我认为用户不会将其识别为“您已达到特殊大小”的内容。仅在活动中显示基准线不是解决方案,因为只要选择形状,基准线就会立即显示。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-01 06:35:45

对于对齐辅助线,我不认为你真的想让光标停止。只是在目标的小范围内,调整大小应该停止对光标移动的反应。

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

如果您正在匹配矩形的边缘,您可能会发现像NSMaxXNSMaxY这样的Foundation Rect Functions很有用。

代码语言:javascript
复制
- (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];
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5844170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档