2016-12-28 4 views
0

Я новичок в iOS и объективе c, и я разрабатываю приложение, и я хочу рисовать непрерывно изогнутые линии, как показано на рисунке ниже. Вот мой код, но это сделать только одного staright линия ..Как рисовать изогнутые линии непрерывно в основной графике ios

- (void)drawRect:(CGRect)rect{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // set the line properties 
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor); 
    CGContextSetLineCap(context, kCGLineCapRound); 
    CGContextSetLineWidth(context, 30); 
    CGContextSetAlpha(context, 0.6); 

    // draw the line 
    CGContextMoveToPoint(context, startPoint.x, startPoint.y); 
    CGContextAddLineToPoint(context, endPoint.x, endPoint.y); 
    CGContextStrokePath(context); 
} 

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint current = [touch locationInView:self]; 
    startPoint=current; 
    arrPoints=[[NSMutableArray alloc]init]; 
    [arrPoints addObject:NSStringFromCGPoint(startPoint)]; 
} 

-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint p = [touch locationInView:self]; 

    endPoint=p; 
    [arrPoints addObject:NSStringFromCGPoint(endPoint)]; 
    [self setNeedsDisplay]; 
} 

-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ 
    [self touchesMoved:touches withEvent:event]; 
} 

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

enter image description here

ответ

1

Ваш код уже строит массив точек.

Теперь вам нужно изменить метод drawRect для рисования сегментов линии между всеми точками, а не только последним.

Возможно, вы получите лучшую производительность, если вы построите UIBezierPath из своих сегментов и нарисуйте это за один раз.

Результатом этого будет непрерывная серия коротких отрезков, которые приближаются к кривой. Если пользователь быстро перемещает свой палец, сегменты линий будут длиннее, что делает кривую более изменчивой.

Как только вы получите эту работу, есть методы, которые вы можете использовать для сглаживания результирующей кривой. Отличная «кулинарная книга разработчика Core iOS разработчика» Эрика Садун имеет рецепт под названием «Сглаживание», охватывающий эту тему. Он делает именно то, что вы хотите - берет пользовательский рисунок от руки и сглаживает его.

У меня есть несколько проектов на Github, которые используют технику сглаживания линии Эрика Садун.

Проект KeyframeViewAnimations рисует кривую, проходящую через набор предопределенных точек.

Проект «RandomBlobs» рисует замкнутую кривую, которая является сглаженной версией многоугольника.

Оба они включают в себя код сглаживания кривой д-ра Садуна, но опять же глава из ее книги лучше всего подходит для ваших нужд.

+0

Что я хочу достичь, так это предположение, что есть пять видов, и я начал рисовать с одного вида и перемещать линию на другой вид на втором экране. Я хочу нарисовать кривую, в каком направлении движется палец. – IMakk

+1

Основываясь на вашем описании, техника сглаживания, изложенная в Эрика Садун «Кулинарная книга разработчика Core iOS» в рецепте «Сглаживание рисунков» - это именно то, что вы хотите. Он использует технологию, называемую сплайнами Catmull-Rom, чтобы создать плавную кривую из точек чертежа пользователя пальцем. Я предлагаю купить эту книгу. Он наполнен драгоценными камнями, как этот, и этот «рецепт» стоит книги, поскольку он делает именно то, что вы хотите. –

+0

Спасибо за ваш ответ. – IMakk