2013-05-27 3 views
3

Я ищу что-то, что отмечено красным, как маркер, но не знаю, можно ли это сделать или нет.Каллиграфия Рисунок IOS Coregraphics

Похоже на маркировку, используя ручку каллиграфии.

enter image description here

Пробуя следующий код, как ответил «Андрей», я получаю следующий вывод с пробелами в процессе рисования.

enter image description here

Brush изображение можно найти здесь используется enter image description here

внесении дополнительных изменений в коде, я нашел еще я не в состоянии получить ожидаемый результат. Здесь я пытаюсь заполнить путь, который существует между текущей точкой и следующей точкой.

- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 


    CGFloat w=5.0; 
    CGFloat h=2.0; 
    CGContextRef context=UIGraphicsGetCurrentContext(); 
    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor); 

    for(int i=0;i<self.positions.count;i++){ 
     CGPoint point=[[self.positions objectAtIndex:i] CGPointValue]; 

     CGFloat x=point.x-(w/2.0); 
     CGFloat y=point.y-(h/2.0); 
     CGContextFillRect(context, CGRectMake(x, y, w, h)); 
     if(i+1<self.positions.count){ 
      CGPoint nextPoint=[[self.positions objectAtIndex:(i+1)] CGPointValue]; 
      CGMutablePathRef myPath=CGPathCreateMutable(); 
      CGPathMoveToPoint(myPath, NULL, x, y); 
      CGFloat x1=nextPoint.x-(w/2.0); 
      CGFloat y1=nextPoint.y-(h/2.0); 

      CGPathAddLineToPoint(myPath, NULL, x1, y1); 
      CGPathAddLineToPoint(myPath, NULL, w, y1); 
      CGPathAddLineToPoint(myPath, NULL, w, y); 
      CGPathCloseSubpath(myPath); 
      CGContextFillPath(context); 
     } 
    } 
} 

ответ

2

Те картина может быть сделано с помощью рисования изображения в UIView подкласса с перегруженной drawRect: сообщения. Вам также нужно добавить какой-то сенсорный обработчик для захвата касаний. Так вот некоторый код:

@interface DrawingView() 

@property (nonatomic, strong) NSMutableArray *positions; 

@end 

@implementation DrawingView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [self awakeFromNib]; 
    } 
    return self; 
} 

- (void)awakeFromNib 
{ 
    self.positions = [[NSMutableArray alloc] init]; 
} 

- (void)drawRect:(CGRect)rect 
{ 
    [super drawRect:rect]; 

    UIImage *brushImage = [UIImage imageNamed:@"brush.png"]; 
    for (NSValue *object in self.positions) { 
     CGPoint point = [object CGPointValue]; 
     [brushImage drawAtPoint:CGPointMake(point.x - brushImage.size.width/2.0, point.y - brushImage.size.height/2.0)]; 
    } 
} 

- (void)addPoint:(CGPoint)point 
{ 
    [self.positions addObject:[NSValue valueWithCGPoint:point]]; 

    [self setNeedsDisplay]; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    [self addPoint:[touch locationInView:self]]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    [self addPoint:[touch locationInView:self]]; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    [self addPoint:[touch locationInView:self]]; 
} 

@end 

Вам только нужно создать правильную brush.png и поместить этот вид в любом месте вы хотите.

+0

Никогда не думал, что было бы так легко нарисовать его. Эй, кстати, когда я закодировал, я обнаружил, что осталось немного пробелов, это не должно происходить, поскольку мы постоянно обновляем его в touchhesMoved: – weber67

+0

@ weber67 'touchhesMoved' пропустит некоторые позиции. Вы должны помнить последнюю позицию и интерполировать позиции между ними. – Sulthan

+0

@ weber67 вы должны использовать какую-то интерполяцию как упомянутый выше Султан. Правильная логика заключается в реализации интерполированного чертежа линий с точками, которые вы получили от касаний. Но это может быть медленным со сложными фигурами. –

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