как сделать пунктирную линию подвижной - PullRequest
3 голосов
/ 27 октября 2011

Я использовал коды ниже, чтобы нарисовать пунктирную линию

// get the current CGContextRef for the view
  CGContextRef currentContext =
     (CGContextRef)[[NSGraphicsContext currentContext]
     graphicsPort];

  // grab some useful view size numbers
  NSRect bounds = [self bounds];
  float width = NSWidth( bounds );
  float height = NSHeight( bounds );
  float originX = NSMinX( bounds );
  float originY = NSMinY( bounds );
  float maxX = NSMaxX( bounds );
  float maxY = NSMaxY( bounds );
  float middleX = NSMidX( bounds );
  float middleY = NSMidY( bounds );

   CGContextSetLineWidth( currentContext, 10.0 );
   float dashPhase = 0.0;
   float dashLengths[] = { 20, 30, 40, 30, 20, 10 };
   CGContextSetLineDash( currentContext,
      dashPhase, dashLengths,
      sizeof( dashLengths ) / sizeof( float ) );

   CGContextMoveToPoint( currentContext,
      originX + 10, middleY );
   CGContextAddLineToPoint( currentContext,
      maxX - 10, middleY );
   CGContextStrokePath( currentContext );

enter image description here

это статично.

Но я предпочитаю сделать штрихи и разрывы подвижными

двигаться справа налево и обвести

Возможно ли это?

более улучшенный регистр:

enter image description here

тире ипромежутки двигаются по часовой стрелке автоматически

Добро пожаловать любой комментарий

1 Ответ

2 голосов
/ 27 октября 2011

Самый простой способ - сделать переменную 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];
}
...