2017-01-13 5 views
1

Я создал образец демо для создания случайного пути, используя объект UIBezier. Я знаю, что задал тот же тип вопроса, который уже был задан, Но я не смог так решить.Как создать путь Безье с разным цветом?

Код

@implementation RandomShape 
@synthesize randomPath,size,color; 

- (void)drawRect:(CGRect)rect { 

    self.size = 1.0; 
    [self.color setStroke]; 
    [self.randomPath stroke]; 
} 

-(id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if(self) 
    { 
     self.randomPath = [UIBezierPath bezierPath]; 
     [self.randomPath stroke]; 
    } 
    return self; 
} 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    [self.randomPath moveToPoint:[touch locationInView:self]]; 
     [self.randomPath setLineWidth:size]; 
    [self setNeedsDisplay]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *mytouch=[touches anyObject]; 
    [self.randomPath addLineToPoint:[mytouch locationInView:self]]; 
    [self setNeedsDisplay]; 
} 
-(void)clearRandomShape 
{ 
    self.randomPath = nil; //Set current path nil 
    self.randomPath = [UIBezierPath bezierPath]; //Create new path 
    [self.randomPath setLineWidth:2.0]; 
    [self setNeedsDisplay]; 
} 

1) У меня есть выбрать цвет из точки зрения сборщика.

Теперь моя проблема,

-> Когда я выбираю цвет из палитры это изменить все предыдущие цвета линии, как это.

(Он показывает последний цвет, который я выбираю по всей случайной траектории.)

---> Мое требование я палочка случайного пути отличаются различным цветом в.

Пожалуйста, помогите мне, я смущаюсь.

спасибо.

+0

нарисовать вашу линию в несколько сегментов и цвет каждого сегмента на ваш выбор ? Я также помню, как читал [CAGradientLayer] (https://developer.apple.com/reference/quartzcore/cagradientlayer), который можно использовать для окраски градиентом –

+0

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

+0

Это именно то, что я имел в виду, каждый раз, когда пользователь рисует - в 'touchhesBegan', вместо того, чтобы добавлять больше строк к существующему, создайте новый путь с новыми свойствами для этого пути. Вместо одного 'UIBezierPath', поддерживайте и' Array'. Кстати, я не предоставляю официальный ответ, потому что я код в swift3, может закончиться синтаксической ошибкой, если я попытаюсь ответить в objC, извинения. –

ответ

1

Написать этот код там, где вы хотите создать путь ..

//path 1 
UIBezierPath *linePath = [[UIBezierPath alloc] init]; 
[linePath moveToPoint:CGPointMake(100, 100)]; 
[linePath addLineToPoint:CGPointMake(275, 100)]; 

CAShapeLayer *shapeLayer = [CAShapeLayer layer]; 
shapeLayer.strokeColor = [UIColor redColor].CGColor; 
shapeLayer.fillColor = [UIColor clearColor].CGColor; 
shapeLayer.lineWidth = 2; 
shapeLayer.lineJoin = kCALineJoinRound; 
shapeLayer.lineCap = kCALineCapRound; 
shapeLayer.path = linePath.CGPath; 
[self.view.layer addSublayer:shapeLayer]; 

//Path 2 
UIBezierPath *verticalLinePath = [[UIBezierPath alloc] init]; 
[verticalLinePath moveToPoint:CGPointMake(100, 200)]; 
[verticalLinePath addLineToPoint:CGPointMake(275, 200)]; 
CAShapeLayer *horizontalLayer = [CAShapeLayer layer]; 
horizontalLayer.strokeColor = [UIColor greenColor].CGColor; 
horizontalLayer.fillColor = [UIColor clearColor].CGColor; 
horizontalLayer.lineWidth = 2; 
horizontalLayer.lineJoin = kCALineJoinRound; 
horizontalLayer.lineCap = kCALineCapRound; 
horizontalLayer.path = verticalLinePath.CGPath; 
[self.view.layer addSublayer:horizontalLayer]; 

//Path 
UIBezierPath *path3 = [[UIBezierPath alloc] init]; 
[path3 moveToPoint:CGPointMake(100, 300)]; 
[path3 addLineToPoint:CGPointMake(275, 300)]; 
CAShapeLayer *horizontalLayer3 = [CAShapeLayer layer]; 
horizontalLayer3.strokeColor = [UIColor blueColor].CGColor; 
horizontalLayer3.fillColor = [UIColor cyanColor].CGColor; 
horizontalLayer3.lineWidth = 2; 
horizontalLayer3.lineJoin = kCALineJoinRound; 
horizontalLayer3.lineCap = kCALineCapRound; 
horizontalLayer3.path = path3.CGPath; 
[self.view.layer addSublayer:horizontalLayer3]; 

Выход этого кода ->

it looks like this

+0

Если вы обнаружите, что это полезно, вы можете посмотреть на [GraphViews] (https://github.com/BenOngKaiXian/GraphViews), который я сделал, это не так удобно, но проще, если вы хотите извлечь логику рисование диаграмм для использования. –

+0

Я wan в объективе c, пожалуйста, дайте мне любое предложение в объекте c – hd1344

+0

Мое другое требование - я хочу рисовать с разным разным размером. Но когда я изменяю размер пути, мой старый размер пути остается таким, каким он есть. Спасибо, что помогли мне , – hd1344

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