2015-04-08 4 views
3

Первое сообщение в stackoverflow so, в первую очередь, привет!Как изменить цвет элемента с помощью UIBezierPath?

Я пробовал свою руку в Swift в первый раз и работаю над проектом, и мне просто нужна была помощь в решении проблемы, которую я испытываю. У меня есть круг с использованием UIBezierPath, который я бы хотел изменить динамически. Однако, когда я пытаюсь даже «жестко закодировать» цвет, я не могу заставить его меняться. Я пробовал посмотреть здесь: How to change the color of a UIBezierPath in Swift?, но он не ответил на мой вопрос. Тем не менее, я вижу, что в одном ответе говорится, что путь Безье не имеет цвета. Если да, то как мне тогда изменить цвет круга, идущего по его пути?

Вот код, я работаю с:

outerCircle.path = UIBezierPath(ovalInRect: CGRect(x: 0.0, y: 0.0, width: frameSize.width, height: frameSize.height)).CGPath 
    outerCircle.lineWidth = 8.0 
    outerCircle.strokeStart = 0.0 
    outerCircle.strokeEnd = 0.45 
    outerCircle.lineCap = kCALineCapRound 
    outerCircle.fillColor = UIColor.clearColor().CGColor 
    outerCircle.strokeColor = UIColor.grayColor().CGColor 
    outerCircleView.layer.addSublayer(outerCircle) 

    outerCircle.strokeStart = 0.0 
    outerCircle.strokeEnd = 1.0 

    vibrancyView.contentView.addSubview(outerCircleView) 

    innerCircleView.frame.size = frameSize 

    let innerCirclePadding: CGFloat = 12 
    innerCircle.path = UIBezierPath(ovalInRect: CGRect(x: innerCirclePadding, y: innerCirclePadding, width: frameSize.width - 2*innerCirclePadding, height: frameSize.height - 2*innerCirclePadding)).CGPath 
    innerCircle.lineWidth = 4.0 
    innerCircle.strokeStart = 0.5 
    innerCircle.strokeEnd = 0.9 
    innerCircle.lineCap = kCALineCapRound 
    innerCircle.fillColor = UIColor.clearColor().CGColor 
    innerCircle.strokeColor = UIColor.grayColor().CGColor 
    innerCircleView.layer.addSublayer(innerCircle) 

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

ОБНОВЛЕНИЕ: Итак, вот что я пытался сделать. Я изменил цвета заливки и обводки обеих внутренних и внешних кругов на зеленый, но я до сих пор есть четкие круги:

 outerCircle.path = UIBezierPath(ovalInRect: CGRect(x: 0.0, y: 0.0, width: frameSize.width, height: frameSize.height)).CGPath 
    outerCircle.lineWidth = 8.0 
    outerCircle.strokeStart = 0.0 
    outerCircle.strokeEnd = 0.45 
    outerCircle.lineCap = kCALineCapRound 
    outerCircle.fillColor = UIColor.greenColor().CGColor 
    outerCircle.strokeColor = UIColor.greenColor().CGColor 
    outerCircleView.layer.addSublayer(outerCircle) 

    outerCircle.strokeStart = 0.0 
    outerCircle.strokeEnd = 1.0 

    vibrancyView.contentView.addSubview(outerCircleView) 

    innerCircleView.frame.size = frameSize 

    let innerCirclePadding: CGFloat = 12 
    innerCircle.path = UIBezierPath(ovalInRect: CGRect(x: innerCirclePadding, y: innerCirclePadding, width: frameSize.width - 2*innerCirclePadding, height: frameSize.height - 2*innerCirclePadding)).CGPath 
    innerCircle.lineWidth = 4.0 
    innerCircle.strokeStart = 0.5 
    innerCircle.strokeEnd = 0.9 
    innerCircle.lineCap = kCALineCapRound 
    innerCircle.fillColor = UIColor.greenColor().CGColor 
    innerCircle.strokeColor = UIColor.greenColor().CGColor 
    innerCircleView.layer.addSublayer(innerCircle) 

Я хотел бы иметь круги менять цвета.

+0

И это будут операции на внешних и внутренних кругах. Понял. Спасибо! Именно то руководство, которое я искал. Я пытался изменить fillColor и strokeColor, но мне нужно использовать эти две функции. Спасибо! Именно то, что я искал. Из любопытства, что делать fillColor и strokeColor, тогда, в коде выше, если вы не возражаете объяснить? –

+1

Что такое _are_ 'innerCircle' и' outerCircle'? Являются ли они, случайно, слоями? Если да, разве вы не думаете, что это может быть хорошей идеей упомянуть об этом факте в вашем вопросе? – matt

+0

Хорошо, так что вы делаете правильно, насколько это возможно. Тогда в чем вопрос? Покажите больше своего кода. Покажите достаточно, чтобы кто-то еще мог пропустить ваш код. И _explain_ в чем проблема: что происходит, когда вы запускаете код, и с другой стороны, вы должны? – matt

ответ

4

Путь не имеет цвета. Это путь! Только графический контекст имеет цвет цвета заливки/заливки. Рано или поздно у вас будет графический контекст - путь беззерцания бесполезен без него. Когда вы это сделаете, установите его путь к вашему пути безье, установите его цвет хода/заливки по желанию, а затем выполните штрих/заполните путь. Вуаля.

В вашем случае у вас, похоже, есть пара объектов CAShapeLayer. Вы можете изменить цвета их цветов, потому что они имеют графический контекст - они берут путь и цвета, которые вы им даете, и рисуете их для вас, заполняя и поглаживая путь. Хорошо. Но вы не можете изменить ход бежевого пути или цвет заливки - это просто путь. Все понятие бессмысленно.

Сказав все это, далеко не ясно, в чем проблема. На основе кода, я побежал этот бит этого:

class ViewController: UIViewController { 
    @IBOutlet weak var outerCircleView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let outerCircle = CAShapeLayer() 
     let frameSize = outerCircleView.frame.size 
     outerCircle.path = UIBezierPath(ovalInRect: CGRect(x: 0.0, y: 0.0, width: frameSize.width, height: frameSize.height)).CGPath 
     outerCircle.lineWidth = 8.0 
     outerCircle.strokeStart = 0.0 
     outerCircle.strokeEnd = 0.45 
     outerCircle.lineCap = kCALineCapRound 
     outerCircle.fillColor = UIColor.clearColor().CGColor 
     outerCircle.strokeColor = UIColor.grayColor().CGColor 
     outerCircleView.layer.addSublayer(outerCircle) 

    } 
} 

Он строит и бежит, и я вижу точно то, что я ожидал бы увидеть: толстый серый неполный круг:

enter image description here

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

ОБНОВЛЕНИЕ Вы обновили свой код, чтобы показать вторую версию, включающую зеленую заливку и ход. Так что я попробовал ваш второй код:

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    let outerCircle = CAShapeLayer() 
    let frameSize = outerCircleView.frame.size 
    outerCircle.path = UIBezierPath(ovalInRect: CGRect(x: 0.0, y: 0.0, width: frameSize.width, height: frameSize.height)).CGPath 
    outerCircle.lineWidth = 8.0 
    outerCircle.strokeStart = 0.0 
    outerCircle.strokeEnd = 0.45 
    outerCircle.lineCap = kCALineCapRound 
    outerCircle.fillColor = UIColor.greenColor().CGColor 
    outerCircle.strokeColor = UIColor.greenColor().CGColor 
    outerCircleView.layer.addSublayer(outerCircle) 

    outerCircle.strokeStart = 0.0 
    outerCircle.strokeEnd = 1.0 

} 

И, как и ожидалось, я получил зеленый круг (это не является точным кругом, но это только потому, что моя точка зрения не является квадратом):

enter image description here

Так что опять я не понимаю, в чем проблема: ваш код делает именно то, что я ожидаю от вашего кода.

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