2016-03-31 140 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

相關問題