iOS程序梯度

iOS程序梯度,ios,uicolor,cagradientlayer,Ios,Uicolor,Cagradientlayer,如何通过编程实现与所附图像完全相同的渐变?答案很大程度上取决于设计师用来创建渐变的内容。有一些工具,例如Invision,可以为开发人员提供有用的信息,例如渐变颜色和点。然而,如果他们只是在Photoshop中创建的,很难用编程的方式进行复制,也许你应该要求一张渐变图像 另一个解决方案是在Xcode中使用@IBDesignable渐变视图;包括我在内的许多开发人员都创建了它们,这主要是因为在过去不得不大量处理这个问题。这种方法的一个主要优点是,它非常容易调整颜色,如果需要,甚至可以设置动画 我有

如何通过编程实现与所附图像完全相同的渐变?

答案很大程度上取决于设计师用来创建渐变的内容。有一些工具,例如Invision,可以为开发人员提供有用的信息,例如渐变颜色和点。然而,如果他们只是在Photoshop中创建的,很难用编程的方式进行复制,也许你应该要求一张渐变图像

另一个解决方案是在Xcode中使用
@IBDesignable
渐变视图;包括我在内的许多开发人员都创建了它们,这主要是因为在过去不得不大量处理这个问题。这种方法的一个主要优点是,它非常容易调整颜色,如果需要,甚至可以设置动画

我有一个开源的例子,另外我还写了一个

我曾用我的项目快速尝试创建类似于您的渐变,这是它在Xcode中的外观:-

关键部分是“属性检查器”面板的顶部,在这里可以轻松设置开始和结束渐变颜色,以及渐变角度-您的渐变角度大约为310度

您需要的主要代码粘贴在下面。按照上面的链接了解它的工作原理

import UIKit
@IBDesignable
class LDGradientView: UIView {

    // the gradient start colour
    @IBInspectable var startColor: UIColor? {
        didSet {
            updateGradient()
        }
    }

    // the gradient end colour
    @IBInspectable var endColor: UIColor? {
        didSet {
            updateGradient()
        }
    }

    // the gradient angle, in degrees anticlockwise from 0 (east/right)
    @IBInspectable var angle: CGFloat = 270 {
        didSet {
            updateGradient()
        }
    }

    // the gradient layer
    private var gradient: CAGradientLayer?

    // initializers
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        installGradient()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        installGradient()
    }

    // Create a gradient and install it on the layer
    private func installGradient() {
        // if there's already a gradient installed on the layer, remove it
        if let gradient = self.gradient {
            gradient.removeFromSuperlayer()
        }
        let gradient = createGradient()
        self.layer.addSublayer(gradient)
        self.gradient = gradient
    }

    // Update an existing gradient
    private func updateGradient() {
        if let gradient = self.gradient {
            let startColor = self.startColor ?? UIColor.clear
            let endColor = self.endColor ?? UIColor.clear
            gradient.colors = [startColor.cgColor, endColor.cgColor]
            let (start, end) = gradientPointsForAngle(self.angle)
            gradient.startPoint = start
            gradient.endPoint = end
        }
    }

    // create gradient layer
    private func createGradient() -> CAGradientLayer {
        let gradient = CAGradientLayer()
        gradient.frame = self.bounds
        return gradient
    }

    // create vector pointing in direction of angle
    private func gradientPointsForAngle(_ angle: CGFloat) -> (CGPoint, CGPoint) {
        // get vector start and end points
        let end = pointForAngle(angle)
        //let start = pointForAngle(angle+180.0)
        let start = oppositePoint(end)
        // convert to gradient space
        let p0 = transformToGradientSpace(start)
        let p1 = transformToGradientSpace(end)
        return (p0, p1)
    }

    // get a point corresponding to the angle
    private func pointForAngle(_ angle: CGFloat) -> CGPoint {
        // convert degrees to radians
        let radians = angle * .pi / 180.0
        var x = cos(radians)
        var y = sin(radians)
        // (x,y) is in terms unit circle. Extrapolate to unit square to get full vector length
        if (fabs(x) > fabs(y)) {
            // extrapolate x to unit length
            x = x > 0 ? 1 : -1
            y = x * tan(radians)
        } else {
            // extrapolate y to unit length
            y = y > 0 ? 1 : -1
            x = y / tan(radians)
        }
        return CGPoint(x: x, y: y)
    }

    // transform point in unit space to gradient space
    private func transformToGradientSpace(_ point: CGPoint) -> CGPoint {
        // input point is in signed unit space: (-1,-1) to (1,1)
        // convert to gradient space: (0,0) to (1,1), with flipped Y axis
        return CGPoint(x: (point.x + 1) * 0.5, y: 1.0 - (point.y + 1) * 0.5)
    }

    // return the opposite point in the signed unit square
    private func oppositePoint(_ point: CGPoint) -> CGPoint {
        return CGPoint(x: -point.x, y: -point.y)
    }

    // ensure the gradient gets initialized when the view is created in IB
    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        installGradient()
        updateGradient()
    }
}

为了精确,您可能需要向您的设计师询问他们在创建时使用的精确参数。你需要开始颜色,结束颜色,因为我觉得它是线性的,开始点和结束点。如果它实际上是径向的,那么你需要中心和半径。也可能有多个点——如果是的话,你需要它们和它们相关的颜色。谢谢,这正是我想要的,先生,你救了我一天!