【问题标题】:NSView Not updating?NSView 不更新?
【发布时间】:2010-07-14 02:54:24
【问题描述】:

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

- (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];

}

感谢您的帮助。

【问题讨论】:

    标签: cocoa drag-and-drop nsview redraw nscolor


    【解决方案1】:

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

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

    【讨论】:

    • 我添加了 [self setNeedsDisplay:YES];在每张图纸之后,但没有运气。向其中添加 nslog 显示方法正在被触发。
    【解决方案2】:

    只有在设置了上下文(例如用于绘画的画布)供您绘制时,绘图才有效。当框架调用-drawRect: 时,它已经为您设置了一个绘图上下文,因此像-[NSColor set]-[NSBezierPath fillRect:] 这样的绘图命令可以按照您的预期工作。

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

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

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

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

    - (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 的任何地方之后进行。

    【讨论】:

    • 我对可可还是有点陌生​​,还没有听说过 ivar。当我尝试编译时,我得到错误:'drawBlueColorIvar' undeclared (first use in this function),这似乎是合乎逻辑的,因为我没有声明它。如何声明 ivar?
    • 哦,我知道了,我刚刚添加了 NSColor *drawBlueColorIvar;到视图标题。感谢大家的帮助!
    猜你喜欢
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多