Objective c 可可画;锁;特殊事件上的鼠标
在上一个关于Cocoa中图形的问题的帮助下,我实现了一些基本形状,以及拖动/调整大小 所以,现在我想弄清楚,当一个形状被调整大小,它自动适应旁边另一个形状的大小,然后“锁定”鼠标一段时间时,如何创建一个类似于注释记号的效果 第一次尝试是使用延迟函数,如Objective c 可可画;锁;特殊事件上的鼠标,objective-c,cocoa,graphics,drawing,Objective C,Cocoa,Graphics,Drawing,在上一个关于Cocoa中图形的问题的帮助下,我实现了一些基本形状,以及拖动/调整大小 所以,现在我想弄清楚,当一个形状被调整大小,它自动适应旁边另一个形状的大小,然后“锁定”鼠标一段时间时,如何创建一个类似于注释记号的效果 第一次尝试是使用延迟函数,如 NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 0.5 ]; [NSThread sleepUntilDate:future]; 对所需事件作出反应(例如,形状宽度=高度)。但这并没
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:不客气,这是我的荣幸。顺便说一句,我一直在玩矩形边缘匹配的游戏;这可能比乍一看要复杂一些。祝你好运!我注意到了。如果用户不想使用此功能,我还想避免让他/她按某个键。但这似乎会这是唯一的方法。这个问题的主要目的也是为了避免为圆或正方形编写一个类,我认为最好在应用程序的帮助下生成一个正方形。如果我有一个好的基础,我可以通知你。这个会变得很好:)