2016-03-31 97 views
0

我是Swift新手,我尝试使用CGGradient创建背景渐变,但出现以下错误。无法将int类型的值转换为预期的参数类型CGGradientDrawingOptions

不能转换int类型的值与预期的参数类型CGGradientDrawingOptions

我不知道为什么我不应该在这里使用一个int。任何帮助将不胜感激。

override func viewDidLoad() { 
    super.viewDidLoad() 
    var currentContext = UIGraphicsGetCurrentContext() 
    CGContextSaveGState(currentContext); 
    var colorSpace = CGColorSpaceCreateDeviceRGB() 

    var topColor = UIColor(red: (57/255.0), green: (150/255.0), blue: (199/255.0), alpha: 1) 
    var startColorComponents = CGColorGetComponents(topColor.CGColor) 

    var middleColor = UIColor(red: (90/255.0), green: (60/255.0), blue: (117/255.0), alpha: 0.85) 
    var middleColorComponents = CGColorGetComponents(middleColor.CGColor) 

    var bottomColor = UIColor(red: (215/255.0), green: (109/255.0), blue: (109/255.0), alpha: 1) 
    var endColorComponents = CGColorGetComponents(bottomColor.CGColor) 

    var colorComponents 
     = [startColorComponents[0], startColorComponents[1], startColorComponents[2], startColorComponents[3], 
      middleColorComponents[0], middleColorComponents[1], middleColorComponents[2], middleColorComponents[3], 
       endColorComponents[0], endColorComponents[1], endColorComponents[2], endColorComponents[3] 
      ] 

    var locations:[CGFloat] = [0.0, 0.35, 1.0] 

    var gradient = CGGradientCreateWithColorComponents(colorSpace,&colorComponents,&locations,3) 

    var startPoint = CGPointMake(-0.3, 0.1) 
    var endPoint = CGPointMake(0.2, 1.3) 

    CGContextDrawLinearGradient(currentContext,gradient,startPoint,endPoint, 0) 

    CGContextRestoreGState(currentContext); 

}

+0

如果您跳转到Xcode中的'CGGradientDrawingOptions'的定义(Cmd + click),你会发现它是一个枚举值为CGGradientDrawingOptions .DrawsBeforeStartLocation和CGGradientDrawingOptions .DrawsAfterEndLocation,并带有来自Int32的初始化程序。 – Kevin

回答

0

我假设你是在读取行得到的错误:

CGContextDrawLinearGradient(currentContext,gradient,startPoint,endPoint, 0) 

的问题在这里你是路过0(整数)的最后一个参数。

此例程的声明是:

public func CGContextDrawLinearGradient(c: CGContext?, 
    _ gradient: CGGradient?, 
    _ startPoint: CGPoint, 
    _ endPoint: CGPoint, 
    _ options: CGGradientDrawingOptions) 

在Objective-C的CGGradientDrawingOptions类型是一个整数值的事情,其中​​0表示没有选择。在Swift中,绘图选项被声明为OptionSetType类型的enum。编译器抱怨,因为它期待这个枚举,而不是一个整数。

在Swift中指定这些选项的方式看起来像一个数组,或者包含来自枚举的元素。所以,如果你想既DrawsBeforeStartLocation选项和DrawsAfterEndLocation你可以这样写:

CGContextDrawLinearGradient(someContext, 
    <other arguments here> 
    [.DrawsBeforeStartLocation, .DrawsAfterEndLocation]) 

你的具体情况,你不希望任何选项,因此只是传递一个空的选项设置:

CGContextDrawLinearGradient(currentContext,gradient,startPoint,endPoint, []) 
+0

非常感谢Scott的工作! btw @Kevin我没有读过函数的定义,并尝试使用这个'CGContextDrawLinearGradient'(currentContext,gradient,startPoint,endPoint,[4,5])'',但它仍然抛出同样的错误。所以我很困惑,并恢复到非数组int。 – user3517759

+0

Swift中的枚举不是(通常来说)只是一种奇怪的方式来指定整数,如C或Objective-C中的整数。它们是不同的野兽,它们使它们变得更强大,更安全,但它却让习惯于C方式做事的“老前辈”绊倒。 :-) –

+0

哈我将不得不习惯这:) – user3517759

相关问题