【问题标题】:Defining angle of the gradient using CAGradientLayer使用 CAGradientLayer 定义渐变的角度
【发布时间】:2014-11-12 12:08:53
【问题描述】:

我正在尝试使用CaGradientLayer 绘制角度渐变。我知道可以使用startPointendPoint 定义角度。我可以为一些标准角度计算这些点,如 0、90、180、360 等。但我想为任意角度制定这些点。我曾尝试使用一些三角函数来计算它,但没有取得任何成功。谁能告诉我如何计算任意角度的这些点?

【问题讨论】:

  • CAGradientLayer 仅支持轴向(方向)渐变。
  • @DavidRönnqvist 我知道。我不是在谈论径向渐变。我正在尝试为轴向梯度提供角度。
  • 所以你是在问三角学来计算给定角度的两个点?
  • @DavidRönnqvist 是的,完全正确..

标签: ios objective-c gradient linear-gradients cagradientlayer


【解决方案1】:

斯威夫特 3

static func setGradient(view: UIView!,viewRadius: CGFloat!, color1: UIColor!, color2: UIColor!, angle: Double!, alphaValue: CGFloat!){
    let gradient = CAGradientLayer()
    
    gradient.frame =  CGRect(origin: CGPoint.zero, size: view.frame.size)
    
    gradient.colors = [color1.withAlphaComponent(alphaValue).cgColor, color2.withAlphaComponent(alphaValue).cgColor]
    let x: Double! = angle / 360.0
    let a = pow(sinf(Float(2.0 * M_PI * ((x + 0.75) / 2.0))),2.0);
    let b = pow(sinf(Float(2*M_PI*((x+0.0)/2))),2);
    let c = pow(sinf(Float(2*M_PI*((x+0.25)/2))),2);
    let d = pow(sinf(Float(2*M_PI*((x+0.5)/2))),2);
    
    gradient.endPoint = CGPoint(x: CGFloat(c),y: CGFloat(d))
    gradient.startPoint = CGPoint(x: CGFloat(a),y:CGFloat(b))
    
    view.roundCorners([.topLeft, .bottomLeft], radius: viewRadius)
    view.layer.insertSublayer(gradient, at: 0)
    
    
}

【讨论】:

    【解决方案2】:

    这在很大程度上基于 Sarthak Sharma 的解决方案。我做了一个 UIView 的扩展,我认为可读性和类型转换可以改进一点:

    extension UIView {
    
        func setGradient(colors: [CGColor], angle: Float = 0) {
            let gradientLayerView: UIView = UIView(frame: CGRect(x:0, y: 0, width: bounds.width, height: bounds.height))
            let gradient: CAGradientLayer = CAGradientLayer()
            gradient.frame = gradientLayerView.bounds
            gradient.colors = colors
    
            let alpha: Float = angle / 360
            let startPointX = powf(
                sinf(2 * Float.pi * ((alpha + 0.75) / 2)),
                2
            )
            let startPointY = powf(
                sinf(2 * Float.pi * ((alpha + 0) / 2)),
                2
            )
            let endPointX = powf(
                sinf(2 * Float.pi * ((alpha + 0.25) / 2)),
                2
            )
            let endPointY = powf(
                sinf(2 * Float.pi * ((alpha + 0.5) / 2)),
                2
            )
    
            gradient.endPoint = CGPoint(x: CGFloat(endPointX),y: CGFloat(endPointY))
            gradient.startPoint = CGPoint(x: CGFloat(startPointX), y: CGFloat(startPointY))
    
            gradientLayerView.layer.insertSublayer(gradient, at: 0)
            layer.insertSublayer(gradientLayerView.layer, at: 0)
        }
    
    }
    

    将此添加到新的或相关的 Swift 文件中,您只需调用 myView.setGradient(colors: gradientColorsArray)myView.setGradient(colors: gradientColorsArray, angle: 90)

    【讨论】:

    • 值 X 在 (alpha + X) 中的含义
    【解决方案3】:

    这是一种创建视图的方法,该视图允许根据来自滑块(或任何东西)的输入来 360 度旋转其双色渐变。传入的滑块值(下面的“x”变量)介于 0.0 和 1.0 之间。

    在 0.0 时,渐变是水平的(颜色 A 在上面,颜色 B 在下面),旋转 360 度到值 1.0(与值 0.0 相同 - 或完全旋转)。

    例如当 x = 0.25 时,颜色 A 为左,颜色 B 为右。在 0.5 时,颜色 A 位于下方,颜色 B 位于上方,0.75 时颜色 A 位于右侧,颜色 B 位于左侧。它从右到左逆时针旋转。

    它有四个参数:frame, colourA, colourB 和输入值 (0-1)。

    -(UIView *)gradientViewWithFrame:(CGRect)frame colourA:(UIColor *)A colourB:(UIColor *)B rotation:(float)x {
    
    //x is between 0 and 1, eg. from a slider, representing 0 - 360 degrees
    //colour A starts on top, with colour B below
    //rotations move anti-clockwise
    
    //1. create the colour view
    UIView * colourView = [UIView new];
    colourView.frame = frame;
    
    //2. create the gradient layer
    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.frame = colourView.bounds;
    gradient.colors = [NSArray arrayWithObjects:(id)[A CGColor], (id)[B CGColor], nil];
    [colourView.layer insertSublayer:gradient atIndex:0];
    
    //3. create coordinates
    float a = pow(sinf((2*M_PI*((x+0.75)/2))),2);
    float b = pow(sinf((2*M_PI*((x+0.0)/2))),2);
    float c = pow(sinf((2*M_PI*((x+0.25)/2))),2);
    float d = pow(sinf((2*M_PI*((x+0.5)/2))),2);
    
    //4. set the gradient direction
    [gradient setStartPoint:CGPointMake(a, b)];
    [gradient setEndPoint:CGPointMake(c, d)];
    
    return colourView;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      相关资源
      最近更新 更多