Как создать путь Безье с другим цветом?

Я сделал пример демонстрации для создания случайного пути с использованием объекта 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) Я выбрал цвет в представлении выбора.

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

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

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

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

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

Спасибо.


person Hardik1344    schedule 13.01.2017    source источник
comment
нарисовать свою линию в нескольких сегментах и ​​раскрасить каждый сегмент по своему выбору? Я также помню, как читал CAGradientLayer, который можно использовать для градиентного окрашивания.   -  person Ben Ong    schedule 13.01.2017
comment
Еще одно мое требование: я хочу рисовать с разным размером. Но когда я меняю размер пути, мой старый размер пути остается прежним. Спасибо, помогите мне, пожалуйста.   -  person Hardik1344    schedule 13.01.2017
comment
Это именно то, что я имел в виду, каждый раз, когда пользователь рисует - в touchesBegan вместо добавления дополнительных строк к существующему создавайте новый путь с новыми свойствами для этого пути. Вместо одного UIBezierPath поддерживайте и Array его. Кстати, я не даю официального ответа, потому что я кодирую в swift3, и это может привести к синтаксической ошибке, если я попытаюсь ответить в objC, извиняюсь.   -  person Ben Ong    schedule 13.01.2017


Ответы (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];

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

выглядит так

person Krishna Datt Shukla    schedule 13.01.2017
comment
если вы найдете это полезным, вы можете взглянуть на GraphViews, которые я сделал, это не так удобен для пользователя, но проще, если вы хотите извлечь логику рисования диаграмм для использования. - person Ben Ong; 13.01.2017
comment
Я не согласен с задачей c, пожалуйста, дайте мне какое-либо предложение по цели c - person Hardik1344; 13.01.2017
comment
Еще одно мое требование: я хочу рисовать с разным размером. Но когда я меняю размер пути, мой старый размер пути остается прежним. Спасибо, помогите мне, пожалуйста. - person Hardik1344; 13.01.2017
comment
Я не требую этого типа требований. Я хочу, чтобы когда я рисую случайный путь, он должен быть выбран выбранным цветом. Опять же, когда я рисую путь случайным цветом, он должен рисовать этот цвет, и помните, что оба цвета должны отображаться не один. пожалуйста, помогите мне, используя демо. Спасибо - person Hardik1344; 13.01.2017
comment
Извините, сэр, я новичок, поэтому я запутался, не смог интегрировать другой сложный код. Извините :( - person Hardik1344; 13.01.2017