Caixa de seleção de desenho (rubberbanding, formigas marchando) em Cacau, ObjectiveC
Eu atualmente implementei uma caixa de seleção simples usando eventos de mouse e redesenho de um retângulo no mouse arrastar. Aqui está meu código:
-(void)drawRect:(NSRect)dirtyRect
{
if (!NSEqualRects(self.draggingBox, NSZeroRect))
{
[[NSColor grayColor] setStroke];
[[NSBezierPath bezierPathWithRect:self.draggingBox] stroke];
}
}
#pragma mark Mouse Events
- (void)mouseDown:(NSEvent *)theEvent
{
NSPoint pointInView = [self convertPoint:[theEvent locationInWindow] fromView:nil];
self.draggingBox = NSMakeRect(pointInView.x, pointInView.y, 0, 0);
[self setNeedsDisplay:YES];
}
- (void)mouseDragged:(NSEvent *)theEvent
{
NSPoint pointInView = [self convertPoint:[theEvent locationInWindow] fromView:nil];
_draggingBox.size.width = pointInView.x - (self.draggingBox.origin.x);
_draggingBox.size.height = pointInView.y - (self.draggingBox.origin.y);
[self setNeedsDisplay:YES];
}
- (void)mouseUp:(NSEvent *)theEvent
{
self.draggingBox = NSZeroRect;
[self setNeedsDisplay:YES];
}
Ref:http://cocoadev.com/HowToCreateWalkingAnts
Questões:
Essa é a maneira mais eficiente de fazer isso? Se a visualização fosse complexa, seria mais eficiente desenhar uma visão transparente sobre a visualização principal em vez de redesenhar continuamente a visualização durante a duração do arrastamento do mouse (http://www.cocoabuilder.com/archive/cocoa/99877-drawing-selection-rectangle.html) Como isso é feito? Eu não consigo encontrar nenhum exemplo.