0

我正在处理拖放视图,并在网络上找到了一些拖放操作的处理程序。我想让它在用户将文件拖到拖放区域上时变为蓝色,并在退出拖放区域时再次变为灰色。问题是当您将鼠标拖到它上面或退出它时它没有更新。继承人的一些代码:

- (void)drawRect:(NSRect)rect
{
   NSRect bounds = [self bounds];
   [[NSColor grayColor] set];
   [NSBezierPath fillRect:bounds];
}

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender  {
    NSRect bounds = [self bounds];
    [[NSColor blueColor] set];
    [NSBezierPath fillRect:bounds];

    return NSDragOperationCopy;

}

- (void)draggingExited:(id <NSDraggingInfo>)sender {
    NSRect bounds = [self bounds];
    [[NSColor grayColor] set];
    [NSBezierPath fillRect:bounds];

}

谢谢你的帮助。

4

2 回答 2

2

你在哪里打电话[yourView: setNeedsDisplay]

这就是你如何让绘图框架知道它需要用 向你的UIView子类发送消息的方式drawRect:,所以当事情发生变化时你应该这样做。在您的情况下,这可能意味着鼠标进入或退出放置区域时。

于 2010-07-14T02:56:40.920 回答
1

绘图仅在设置了上下文(例如用于绘画的画布)供您绘制时才有效。当框架调用-drawRect:它时,它已经为你设置了一个绘图上下文,所以绘图命令就像你期望的那样工作-[NSColor set]-[NSBezierPath fillRect:]

外面-drawRect:通常没有设置绘图上下文。在外面使用绘图命令-drawRect:就像在空中挥舞画笔;没有画布,所以没有绘画发生。

在 99.99% 的情况下,所有视图绘图都应该保留在其中,-drawRect:因为 NSView 做了很多您不想做的工作来正确有效地设置绘图上下文。

那么,如何在-draggingEntered:-draggingExited:方法中更改视图的绘制?通过副作用。

在所有三种情况下,您都在做同样的事情:1)设置颜色和 2)绘制矩形。唯一的区别是每种方法的颜色变化。那么,为什么不使用-drawRect:ivar 控制使用哪种颜色,如下所示:

- (void)draggingEntered:(id <NSDraggingInfo>)sender {
    drawBlueColorIvar = YES;
    // ...
}

然后在-drawRect:你这样做:

- (void)drawRect:(NSRect)rect {
    NSColor *color = drawBlueColorIvar ? [NSColor blueColor] : [NSColor grayColor];
    [color set];
    [NSBezierPath fillRect:rect];
}

(请注意,我没有使用[self bounds]。如果可能,只绘制“脏”矩形会更有效。)

最后,您需要某种方式告诉框架您的视图需要在 drawBlueColorIvar 更改时重绘。除非被告知需要,否则框架不会绘制任何东西。正如 Chris Cooper 所说,您使用[self setNeedsDisplay:YES]. 这应该在您更改的任何地方之后进行drawBlueColorIvar

于 2010-07-14T16:24:35.463 回答