Изменение цвета пути, нарисованного в UIView draw (_rect) - PullRequest
2 голосов
/ 13 мая 2019

Я нарисовал круг, используя addArc в моей функции UIView subclass 'draw(_ rect: CGrect).Первоначально он прекрасно рисует, но когда происходит какой-то триггер пользовательского интерфейса, я хотел изменить цвет заливки круга, изменив значение свойства isFilledIn.

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

var isFilledIn = false {
    didSet {
        setNeedsDisplay()
    }
}

override func draw(_ rect: CGRect) {
    if let context = UIGraphicsGetCurrentContext() {            
        context.setLineWidth(outlineWidth)
        myOutlineColor.setStroke()

        if isFilledIn {
            myFilledColor.setFill()
        } else {
            myEmptyColor.setFill()
        }

        let center = CGPoint(x: frame.size.width / 2, y: frame.size.height / 2)
        let radius = (frame.size.width - 10) / 2

        context.addArc(center: center, radius: radius, startAngle: 0.0, endAngle: .pi * 2.0, clockwise: true)

        context.drawPath(using: .fillStroke)
    }
}

Я пытался добавить context.clear(rect), но это не дало эффекта.Я также рассмотрел сохранение CGPath в свойстве и просто пытался изменить его вместо вызова setNeedsDisplay, но я не был уверен, как применить изменения цвета заливки, если все, что у меня есть, - CGPath.

Я понимаю, что существуют другие, потенциально более простые / более эффективные способы создания кругов (например, UIBezierPath или UIView с радиусом угла), но я специально пытаюсь лучше понять Core Graphics и хочу понятьпочему это не работает.

1 Ответ

1 голос
/ 13 мая 2019

Звонил мой установочный код вида в layoutSubviews, забывая, что этот метод может вызываться несколько раз (и так было).Так как Sulthan указал в комментариях выше, у меня были перекрывающиеся представления.Был второй круг поверх того, который я пытался перерисовать.

Добавление оператора if внутри layoutSubviews, чтобы не дать ему настроить круг, исправило его несколько раз.

Спасибо, Султан.

...