0

NSRect に関する質問... Hillegass の本では、楕円 (NSBezierPath *) を描画する NSRect を作成しています。ビューのどこでマウスを押してドラッグしたかによって、NSRect の size.width および/または size.height が負になる場合があります (つまり、右上から開始して左下にドラッグすると、両方とも負になります)。実際に描画するとき、システムは負の幅や高さを使用して、ドラッグした場所の NSPoint を特定するだけですか? したがって、NSRect を更新しますか? NSRect のサイズが必要な場合は、絶対値を使用する必要がありますか?

この章では、著者は MIN() および MAX() マクロを使用して NSRect を作成しました。ただし、チャレンジ ソリューションでは、マウス イベントに応答して次の 3 つのメソッドを提供します。

- (void)mouseDown:(NSEvent *)theEvent
{
    NSPoint pointInView = [self convertPoint:[theEvent locationInWindow] fromView:nil];
    // Why do we offset by 0.5? Because lines drawn exactly on the .0 will end up spread over two pixels.
    workingOval = NSMakeRect(pointInView.x + 0.5, pointInView.y + 0.5, 0, 0);
    [self setNeedsDisplay:YES];
}

- (void)mouseDragged:(NSEvent *)theEvent
{
    NSPoint pointInView = [self convertPoint:[theEvent locationInWindow] fromView:nil];
    workingOval.size.width = pointInView.x - (workingOval.origin.x - 0.5);
    workingOval.size.height = pointInView.y - (workingOval.origin.y - 0.5);
    [self setNeedsDisplay:YES];
}

- (void)mouseUp:(NSEvent *)theEvent
{
    [[self document] addOvalWithRect:workingOval];
    workingOval = NSZeroRect; // zero rect indicates we are not presently drawing
    [self setNeedsDisplay:YES];
}

このコードは、潜在的な負の値に関係なく、正常な四角形を生成します。負の値は、原点 (「マウスを押した」ポイント) に対して左にシフトしただけであることを理解しています。ドラッグ先の NSPoint を適切に計算する際に、舞台裏で何が起こっているのでしょうか?

4

1 に答える 1

1

NSRect は、NSPoint および NSSize として定義されているだけです。NSSize は CGFloats のペアとして定義されているだけですが、ドキュメントには次のように記載されています。

通常、幅と高さの値は負ではありません。NSSize 構造体を作成する関数は、これらの属性に負の値を設定することを妨げません。ただし、幅または高さの値が負の場合、一部のメソッドの動作は未定義になる可能性があります。

上記のコードでは、舞台裏で特別なことはまったく行われていません。たまたま負のサイズまたは幅を持つ長方形 (workingOval) を作成していますが、実際にはどこでも使用していません。

他の場所で workingOval をどうするかによって、舞台裏で何が起こっているかが異なります。しかし、それは 3 つの非常に単純なことのうちの 1 つです。一部のメソッドは、(origin=(30, 40), size=(-10, -20)) のような rect を (origin=(20, 20), size=(10, 20)) と同一のものとして扱います。他の人はそれを無効な四角形として扱います。テストを行わず、ガベージ結果を提供するだけであると仮定するものもあります。たとえば、NSMinX は 10 ではなく 30 を返します。

于 2012-05-25T20:56:23.120 に答える