В настоящее время я реализовал простой блок выбора с использованием событий мыши и перерисовку прямоугольника при перетаскивании мышью. Вот мой код:Ящик выбора чертежа (резиновые ленты, маршевые муравьи) в Cocoa, ObjectiveC
-(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
Вопросы:
Является ли это самый эффективный способ сделать это? Если представление было сложным, было бы более эффективным сделать прозрачный вид над основным видом вместо непрерывного перерисовки представления на время перетаскивания мышью (http://www.cocoabuilder.com/archive/cocoa/99877-drawing-selection-rectangle.html)? Как это делается? Кажется, я не могу найти примеров.
Это здорово. Чтобы прояснить это, создает ли это анимированный слой над представлением (т. Е. Не использует 'drawRect:', потому что этот слой сохраняется)? –
@JohnSmith Правильно, не требуется «drawRect» (по крайней мере, для коробки выбора маршевых муравьев). Если вы делаете что-то еще в 'drawRect', не стесняйтесь иметь его. Но это не нужно для окна выбора. – Rob
Отличный ответ! Просто интересно, будем ли мы все еще делать марш в этом столетии. Кажется, совсем немного стиля 1980/1990-х годов :-) – Jay