Самый простой способ - сделать переменную phase
иваром и переопределить keyDown:
- (BOOL)acceptsFirstResponder
{
return YES;
}
- (void)keyDown:(NSEvent *)theEvent
{
switch ([theEvent keyCode])
{
case 0x7B: //left cursor key
dashPhase += 10.0;
break;
case 0x7C: //right cursor key
dashPhase -= 10.0;
break;
default:
[super keyDown:theEvent];
break;
}
[self setNeedsDisplay:YES];
}
Также убедитесь, что initialResponder вашего окна установлен на пользовательский вид (я предполагаю, что вы делаете свой рисунок в подклассе NSView).
Обтекание кода не должно быть слишком сложным. Просто разделите ваш массив dashLengths
и соберите его так, как вы хотите. (Вы не указали, хотите ли вы разбить одиночные тире или нет)
Обновление
OK. Я неправильно понял часть вашего вопроса «двигайтесь справа налево и обведите кружком». Я думал, ты хочешь, чтобы пунктирная линия обернулась. Если вы хотите нарисовать прямоугольник с подвижной пунктирной границей, это будет даже проще. Поместите это в подкласс NSView, и оно должно нарисовать пунктирный прямоугольник, который перемещает его штрихи при нажатии ← или →:
- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
patternRectangle = [self bounds];
}
return self;
}
- (void)drawRect:(NSRect)dirtyRect
{
CGContextRef currentContext = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
CGContextSetLineWidth( currentContext, 10.0 );
CGFloat dashLengths[] = { 20, 30, 40, 30, 20, 10 };
CGContextSetLineDash( currentContext, dashPhase, dashLengths, sizeof( dashLengths ) / sizeof( float ) );
CGPathCreateWithRect(CGRectMake(2.0, 2.0, 100.0, 100.0), NULL);
CGContextStrokeRect(currentContext, CGRectInset(NSRectToCGRect([self bounds]), 10.0, 10.0));
CGContextStrokePath( currentContext );
}
- (BOOL)acceptsFirstResponder
{
return YES;
}
- (void)keyDown:(NSEvent *)theEvent
{
switch ([theEvent keyCode])
{
case 0x7B:
dashPhase += 10.0;
break;
case 0x7C:
dashPhase -= 10.0;
break;
default:
[super keyDown:theEvent];
break;
}
[self setNeedsDisplay:YES];
}