4

我正在关注 Aaron 为 Mac OS X 编写的 Cocoa 编程的第 23 章。
我必须从视图中拖动一个字母并将其复制到另一个应用程序中,例如文本编辑。
这是我发现问题的代码部分:

- (void) mouseDragged:(NSEvent *)theEvent
{
    NSPasteboard* pb=[NSPasteboard pasteboardWithName: NSDragPboard];
    NSPoint down=[mouseDownEvent locationInWindow];
    NSPoint drag=[theEvent locationInWindow],p;
    NSSize size=[string sizeWithAttributes: attributes];
    NSRect imageBounds;
    NSImage* image=[NSImage alloc];
    float distance;
    distance= hypot(down.x-drag.x, down.y-drag.y);
    if(distance<3 || [string length]==0)
    return;
    image=[image initWithSize: size];
    imageBounds.origin=NSZeroPoint;
    imageBounds.size=size;
    [image lockFocus];
    [self drawStringCenteredIn: imageBounds];
    [image unlockFocus];
    p=[self convertPoint: down fromView: nil];
    p.x= p.x - size.width/2;
    p.y= p.y - size.height/2;
    [self writeToPasteboard: pb];
    [self dragImage: image at: p offset: NSZeroSize event: mouseDownEvent pasteboard: pb source: self slideBack: YES];
}

其中:
- mouseDownEvent 是先前保存的事件,当用户单击讲台时(mouseDown 事件);
- string 是一个 NSMutableAttributesString,一个最大 1 个 lected 的字符串,包含要显示到视图中的 lecter;

当事件发生时,视图上已经显示了一个字母(因此字符串的长度为 1)。如果我忘记了一些重要信息,请询问。

问题:拖放操作工作正常,但问题是当我拖动图像时,我没有看到图像从其原始位置移位。
这是我在拖动字母时看到的:

在此处输入图像描述

这是我应该看到的:

在此处输入图像描述

所以字母应该会移位,但这不会发生。我不认识这个问题的原因,我认为方法drawImageCenteredIn应该可以正常工作。这是这个方法的代码:

- (void) drawStringCenteredIn: (NSRect) rect
{
    NSSize size=[string sizeWithAttributes: attributes];
    NSPoint origin;
    origin.x= rect.origin.x+ (rect.size.width+size.width)/2;
    origin.y=rect.origin.y + (rect.size.height+size.height)/2;
    [string drawAtPoint: origin withAttributes: attributes];
}
4

1 回答 1

1

这很简单。这两行中的符号不​​正确:

  origin.x= rect.origin.x+ (rect.size.width-size.width)/2;
  origin.y= rect.origin.y + (rect.size.height-size.height)/2;

以下是更正的方法:

- (void) drawStringCenteredIn: (NSRect) rect
{
    NSSize size=[string sizeWithAttributes: attributes];
    NSPoint origin;
    origin.x= rect.origin.x+ (rect.size.width-size.width)/2;
    origin.y= rect.origin.y + (rect.size.height-size.height)/2;
    [string drawAtPoint: origin withAttributes: attributes];
}
于 2012-09-21T14:58:38.583 回答