2016-03-31 4 views
0

Я новичок в Swift, и я пытаюсь создать градиент фона с использованием CGGradient, но получаю следующую ошибку.не может преобразовать значение типа int в ожидаемый тип аргумента CGGradientDrawingOptions

не может преобразовать значение типа междунар ожидаемых 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

Если вы перейдите к определению 'CGGradientDrawingOptions' в Xcode (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 параметры чертежа объявляются как enum типа OptionSetType. Компилятор жалуется, потому что ожидает этого перечисления, а не целого.

Способ, которым вы указываете эти параметры в Swift, выглядит как массив или набор, содержащий элементы из перечисления. Так что если вы хотите как вариант DrawsBeforeStartLocation и DrawsAfterEndLocation можно было бы написать:

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

В вашем конкретном случае, вы не хотите, либо опцию, чтобы просто передать пустой набор опций:

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

Спасибо большое Скотту это сработало! btw @Kevin Я прочитал определение функции и попытался использовать этот ' CGContextDrawLinearGradient (currentContext, gradient, startPoint, endPoint, [4,5])', но он по-прежнему выдавал ту же ошибку. Поэтому я был сбит с толку и вернулся к не-массиву int. – user3517759

+0

Перечисления в Swift не являются (вообще говоря) просто странным способом указания целых чисел, таких как C или Objective-C. Они - другой зверь, который делает их более мощными и более безопасными, но он выталкивает «старожилов», которые привыкли к тому, что они делают. :-) –

+0

Ха мне придется привыкнуть к этому :) – user3517759