4

Mac OS X用のAaronの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イベント)。
-文字列はNSMutableAttributesStringであり、ビューに表示されるレクターを含む最大1つの選択された文字列です。

イベントが発生すると、ビューにすでに文字が表示されています(文字列の長さは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

簡単だ。次の2行の符号は正しくありません。

  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 に答える