2013-06-18 2 views
0

Я пытаюсь реализовать рисованный рисунок поверх изображения, но я не хочу сохранять результат как изображение. Я адаптировал код from this article, но я ничего не вижу (хотя я знаю, что метод drawRect вызывается). Я проверил, что я выполняю итерацию через действительные CGPoints в цикле for. Итак, все кажется в очереди, но физически ничего не делается.Рисунок Freehand в iOS - нужно использовать точки

Я что-то упустил?

Кроме того, просто для того, чтобы отметить, я отделил раздел рисования фигуры, но это работает (рисунок овалов, прямоугольников и линий).

Вот код:

- (void)drawRect:(CGRect)rect 
{ 
    if(self.shapeType == DrawShapeTypeCustom) 
    { 
     if(!self.myDrawings) 
     { 
      self.myDrawings = [[NSMutableArray alloc] initWithCapacity:0]; 
     } 

     CGContextRef ctx = UIGraphicsGetCurrentContext(); 
     CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha =0.0; 
     [[UIColor redColor] getRed:&red green:&green blue:&blue alpha:&alpha]; 

     CGContextSetRGBFillColor(ctx , red , green , blue , 0.0); 
     CGContextSetRGBStrokeColor(ctx , red , green , blue , 0.9); 

     CGContextSetLineWidth(ctx , (CGFloat) 5); 

     if([self.myDrawings count] > 0) 
     { 
      CGContextSetLineWidth(ctx , 5); 

      for(int i = 0 ; i < [self.myDrawings count] ; i++) 
      { 
       NSArray * array = [self.myDrawings objectAtIndex:i]; 

       if([array count] > 2) 
       { 
        CGFloat x = [[array objectAtIndex:0] floatValue]; 
        CGFloat y = [[array objectAtIndex:1] floatValue]; 

        CGContextBeginPath(ctx); 
        CGContextMoveToPoint(ctx , x, y); 
        for(int j = 2 ; j < [array count] ; j+= 2) 
        { 
         x = [[array objectAtIndex:0] floatValue]; 
         y = [[array objectAtIndex:1] floatValue]; 

         CGContextAddLineToPoint(ctx , x , y); 
        } 
       } 

       CGContextStrokePath(ctx); 
      } 

     } 
    } 
    else 
    { 
     // Draw shapes... 
    } 
} 
+0

Вы пытались создать 'CGMutablePathRef', а затем добавить это в контекст и погладить путь. Я никогда не делал пути CGContext, которые не были закрыты. Или вы можете настроить массив точек и использовать 'CGContextStrokeLineSegments (CGContextRef c, const CGPoint * points, size_t count)' – Putz1103

+0

Нельзя рисовать под изображением. Я использую общий код для создания и добавления subview для этого пользовательского рисования и рисования фигуры. Формы появляются просто отлично. Я не думал об использовании 'CGContextClosePath', но на самом деле я не хочу закрывать путь. Я только хочу показать путь, который пользователь рисует. Тем не менее, я все равно попробую и посмотрю, покажет ли рисунок. – thephatp

+0

Я думал об использовании сегментов линии, но думал, что это может выглядеть зубчатым. Тем не менее, сейчас что-то лучше, чем ничего, поэтому я отдам его и посмотрю, поможет ли это. Если так, и это выглядит прилично, я просто придерживаюсь этого. Я дам Вам знать. – thephatp

ответ

1
for(int j = 2 ; j < [array count] ; j+= 2) 
{ 
    x = [[array objectAtIndex:0] floatValue]; 
    y = [[array objectAtIndex:1] floatValue]; 

    CGContextAddLineToPoint(ctx , x , y); 
} 

Похоже, что вы рисуете в ту же точку снова и снова. Я думаю, вы должны использовать значение j, которое вы совершаете.

for(int j = 2 ; j < [array count] ; j+= 2) 
{ 
    x = [[array objectAtIndex:j + 0] floatValue]; 
    y = [[array objectAtIndex:j + 1] floatValue]; 

    CGContextAddLineToPoint(ctx , x , y); 
} 
+0

Ничего себе, пропустил это в переводе. Я был уверен, что у меня были правильные точки, но вы абсолютно правы. Спасибо! – thephatp

Смежные вопросы