Как устранить артефакты изображения Objective-C при перерисовке с Core Graphics - PullRequest
1 голос
/ 30 января 2012

Я рисую прямоугольники на экране, используя базовый метод NSBezierPath.У меня есть объект, настроенный для рисования настроенного прямоугольника на экране с каждым инициализированным экземпляром объекта.В этом объекте у меня есть метод, который перемещает прямоугольник с помощью мыши, когда он перемещается по экрану.Для этого я просто использовал метод mouseDragged:.Проблема в том, что, когда я перемещаю его, он оставляет «артефакты изображения», которые появляются в виде тонких линий в 1 пиксель на экране по краям, где ранее был прямоугольник.Это похоже на то, как когда 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];


}

Также, если вам интересно узнать о пустом квадрате слева от синегопрямоугольник, я тоже не могу это объяснить.У меня черный «ромб», кружащийся в кругах диаметром 30px, но каждый раз, когда он перемещается на один пробел (один в секунду на 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.Оба прямоугольника на рисунке являются экземплярами моего объекта.

Picture of Artifacts

1 Ответ

1 голос
/ 30 января 2012

Не волнуйтесь, просто назовите это современным искусством!

А если серьезно. Похоже, вы не очищаете представление в методе drawRect: или drawInContext:.

Нарисуйте прямоугольник цвета фона поверх границ, как первое, что вы делаете, чтобы очистить предыдущий рисунок.

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

NSViews не очищаются автоматически.

...