Странный градиент при использовании CAGradientLayer с радиальным градиентом. - PullRequest
0 голосов
/ 25 октября 2018

Использование кода:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let v = View()
        view.addSubview(v)
        v.frame = CGRect(x: 100, y: 100, width: 200, height: 200)
    }
}

class View : UIView {
    let gradientLayer = CAGradientLayer()
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.backgroundColor = .blue

        gradientLayer.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
        gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
        gradientLayer.endPoint = CGPoint(x: 1, y: 0.5)
        gradientLayer.type = .radial
        gradientLayer.colors = [
            UIColor.red.cgColor,
            UIColor.green.cgColor
        ]
        self.layer.addSublayer(gradientLayer)
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

Ожидается (генерируется Sketch): enter image description here

Результат кода на симуляторе iOS 12: enter image description here

результат кода на реальном устройстве iOS: enter image description here

Моя версия Xcode 10.0 (10A255), я обнаружил, что проблема возникает только тогда, когда startPoint.x == endPoint.x || startPoint.y == endPoint.y

1 Ответ

0 голосов
/ 25 октября 2018

Если y для startPoint и endPoint равны, это означает, что высота эллипса градиента будет равна 0.

В своем фрагменте кода вы можете установить y для entPoint равным 1, чтобы добиться эффекта Sketch.

В структуре QuartzCore имеются следующие комментарии:

/ * Радиальный градиент.Градиент определяется как эллипс с * центром в 'startPoint', а его ширина и высота определяются * '(endPoint.x - startPoint.x) * 2' и '(endPoint.y - startPoint.y) * * 2'соответственно.* /

@ доступно (iOS 3.2, *)

общедоступный статический, радиальный: CAGradientLayerType

...