【问题标题】:How to eliminate Objective-C image artifacts when redrawing with Core Graphics使用 Core Graphics 重绘时如何消除 Objective-C 图像伪影
【发布时间】:2012-01-30 07:26:44
【问题描述】:

我正在使用基本的 NSBezierPath 方法在屏幕上绘制矩形。我有一个对象设置为在屏幕上绘制一个自定义的矩形,并初始化对象的每个实例。在那个对象中,我有一个方法,当它在屏幕上拖动时用鼠标移动矩形。为此,我简单地使用了mouseDragged: 方法。问题是当我移动它时,它会留下“图像伪影”,这些伪影在屏幕上沿矩形之前的边缘显示为 1px 的细线。这类似于 Microsoft Windows 运行缓慢时的情况,当您拖动它时,它会留下一个窗口的重影。还记得在解冻之前您总是如何尝试绘制内容或填满整个屏幕吗?它就像它只是没有足够快地重绘或其他东西。这些文物永远不会消失,除非我通过在它们上面画一些东西来清除它们(比如将矩形拖回它们上面)。

-(void)mouseDown:(NSEvent *)theEvent{
mouseLoc = [theEvent locationInWindow];
xDifference = mouseLoc.x - origin.x;
yDifference = mouseLoc.y - origin.y;

}

-(void)mouseDragged:(NSEvent *)theEvent{
mouseLoc = [theEvent locationInWindow];
NSPoint adjustedOrigin = NSMakePoint((mouseLoc.x-xDifference), (mouseLoc.y-yDifference));
[self setOrigin:adjustedOrigin];


}

此外,如果您想知道蓝色矩形左侧的空白方块,我也无法解释。我有一个黑色的“菱形”在直径为 30 像素的圆圈中旋转,但每次它移动一个空间(在 NSTimer 上每秒一个)它都会非常短暂地跳到那个位置,但为什么我不知道。矩形移动的代码如下:

i+=.5;
int rectangle2X = (100+30*cos(i));
int rectangle2Y = (100+30*sin(i));
//NSLog(@"(%d, %d)", rectangle2X, rectangle2Y);
rectangle2.origin = NSMakePoint(rectangle2X, rectangle2Y);

任何帮助都会很棒。我知道上面的代码并不是你们可能需要的一切,所以请随时提出更多要求。顶部代码来自对象,底部代码来自 AppDelegate。图片中的两个矩形都是我的对象的实例。

【问题讨论】:

    标签: objective-c drawing core-graphics mouseevent artifacts


    【解决方案1】:

    别担心,就叫它现代艺术吧!

    但是说真的。您似乎没有在 drawRect:drawInContext: 方法中清除视图。

    在边界上绘制一个背景色矩形,作为清除先前绘图的第一件事。

    [myBGColor set];
    NSRectFill([self bounds]);
    

    NSViews 不会自动清除。

    【讨论】:

    • 感谢您的回答!我设法将这样的东西合并到我的代码中。
    猜你喜欢
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多