我需要在 View 中显示3色分布。所以我正在使用以下代码。

func drawWithGradientLayer() {

        // total contains sum of all values contained in segmentValues variable.
        // I'm using green -> Orange -> Red colors as colors

        if total == 0 {
            return
        }

        if gradientLayer.superlayer != nil {
            gradientLayer.removeFromSuperlayer()
        }

        var previous: CGFloat = (CGFloat(segmentValues[0])/CGFloat(total))
        var locations: [NSNumber] = [previous]

        for var i=1; i<segmentValues.count; i++ {
            previous = previous + (CGFloat(segmentValues[i])/CGFloat(total))
            locations.append(previous)
        }

        locations.append(1.0) // Line may need to be commented

        gradientLayer = CAGradientLayer()
        gradientLayer.frame = CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height)

        gradientLayer.startPoint = CGPointMake(0.0, 0.5);
        gradientLayer.endPoint = CGPointMake(1.0, 0.5);

        gradientLayer.colors = colors
        gradientLayer.locations = locations

        self.layer.insertSublayer(gradientLayer, atIndex: 0)
}

但是问题是渐变颜色没有按照我的要求进行分配。例如,如果我具有[1,0,1]的值,则条形图应显示50%红色,0%橙色和50%红色。如果值为[0,0,1],则仅应绘制redColor。没有网格线怎么办?
ios - Swift 2.1 : CAGradientLayer color location &amp; distribution-LMLPHP

任何其他更好的解决方案将不胜感激:)

最佳答案

这里的关键是要了解CAGradientLayer中locations的工作方式:



因此,您不能指定诸如[1, 0, 1]之类的位置,而应使用诸如[0.0, 0.33, 0.67, 1.0]之类的位置,并且位置值的数量必须与colors计数相同。

要像在图像中那样使用短的颜色过渡进行渐变,您必须将每种颜色重复两次并指定适当的位置:
ios - Swift 2.1 : CAGradientLayer color location &amp; distribution-LMLPHP

因此,您的代码应类似于:

    gradientLayer.colors =  [
        UIColor.greenColor().CGColor,  UIColor.greenColor().CGColor,
        UIColor.orangeColor().CGColor, UIColor.orangeColor().CGColor,
        UIColor.redColor().CGColor,    UIColor.redColor().CGColor
    ]
    gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
    gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
    gradientLayer.locations = [0.0, 0.2, 0.3, 0.7, 0.8, 1.0]

如果要在不更改其颜色的情况下获得2色渐变,则可以将startPoint.x的值设置为小于0或将endPoint.x的值设置为大于1,并将多个位置设置为零,例如:
    gradientLayer.startPoint = CGPoint(x: -0.01, y: 0.5)
    gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
    gradientLayer.locations = [0.0, 0.0, 0.0, 0.0, 0.1, 1.0]

其结果将类似于以下内容:

ios - Swift 2.1 : CAGradientLayer color location &amp; distribution-LMLPHP

关于ios - Swift 2.1 : CAGradientLayer color location & distribution,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33788533/

10-11 12:02