Используйте радиальный градиент как расширение для UIView - PullRequest
0 голосов
/ 05 марта 2019

Моя цель - сделать расширение радиального градиента для UIView.Вот мой код:

extension UIView {
    func drawRadialGradient() {
        let colors = Colors.gradientColors as CFArray
        let gradient = CGGradient(colorsSpace: nil, colors: colors, locations: nil)
        guard let gradientValue = gradient  else{ return }
        let endRadius: CGFloat? = max(frame.width, frame.height) / 2
        guard let endRadiusValue = endRadius else{ return }
        let bottomcenterCoordinates = CGPoint(x: frame.width / 2, y: frame.height)
        let getCurrentContext = UIGraphicsGetCurrentContext()
        guard let currentContext = getCurrentContext else{ return }
        currentContext.drawRadialGradient(gradientValue, startCenter: bottomcenterCoordinates, startRadius: 0.0, endCenter: bottomcenterCoordinates, endRadius: endRadiusValue, options: CGGradientDrawingOptions.drawsAfterEndLocation)
        let radialGradientLayer = CALayer(layer: currentContext)
        radialGradientLayer.frame = bounds
        radialGradientLayer.masksToBounds = true
        self.layer.insertSublayer(radialGradientLayer, at: 1)
    }
}

Когда я вызываю эту функцию в viewDidLoad () или viewWillAppear (), компилятор не содержит ошибок и предупреждений, функция просто не работает.я называю это следующим образом:

override func viewDidLoad() {
    super.viewDidLoad()
    view.drawRadialGradient()
}

Например, я создал функцию расширения для рисования линейного градиента на UIView, и она работает, я называю это так же, как функция радиального градиента:

func drawLinearGradient() {
    let gradientLayer = CAGradientLayer()
    gradientLayer.frame = self.frame
    gradientLayer.colors = Colors.gradientColors
    gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.95)
    gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.05)
    self.layer.insertSublayer(gradientLayer, at: 0)
}

Для цветов я создал структуру:

struct Colors {
    static let firstColor = colorPicker(red: 70, green: 183, blue: 0)
    static let secondColor = colorPicker(red: 0, green: 170, blue: 116)
    static let thirdColor = colorPicker(red: 20, green: 0, blue: 204)
    static let gradientColors = [firstColor.cgColor, secondColor.cgColor, thirdColor.cgColor]
    static func colorPicker(red: CGFloat, green: CGFloat, blue: CGFloat) -> UIColor {
        let color = UIColor(red: red / 255, green: green / 255, blue: blue / 255, alpha: 1.0)
        return color
    }
}

Пожалуйста, дайте мне совет, как реализовать его как расширение.

1 Ответ

0 голосов
/ 05 марта 2019

Одна главная вещь, которую я вижу в вашем коде, это то, что вы пытаетесь рисовать в viewDidLoad.Не делайте этого, помимо других проблем, размер кадра еще не установлен должным образом в данный момент.Если вы хотите, чтобы UIView рисовал, то выведите класс из UIView и сделайте рисование в методе draw этого класса.

Если вы хотите, чтобы radialGradientLayer CALayer, который вы создали, рисовал (в настоящее время он просто пуст), затем выведите подкласс из CALayer и реализуйте его метод drawInContext.

...