Градиентная заливка в Swift для iOS-диаграмм

Я пытаюсь создать красивую градиентную заливку, как показано в демонстрациях на странице ios-charts. Однако я не могу понять это в swift vs obj-c. Вот код obj-c:

NSArray *gradientColors = @[
                    (id)[ChartColorTemplates colorFromString:@"#00ff0000"].CGColor,
                    (id)[ChartColorTemplates colorFromString:@"#ffff0000"].CGColor
                    ];
CGGradientRef gradient = CGGradientCreateWithColors(nil, (CFArrayRef)gradientColors, nil);

set1.fillAlpha = 1.f;
set1.fill = [ChartFill fillWithLinearGradient:gradient angle:90.f];

Теперь вот моя версия этого в Swift:

    let gradColors = [UIColor.cyanColor().CGColor, UIColor.init(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0)]
    let colorLocations:[CGFloat] = [0.0, 1.0]
    let gradient = CGGradientCreateWithColors(CGColorSpaceCreateDeviceRGB(), gradColors, colorLocations)

Чего мне не хватает, так это: Chart Fill fillWithLinearGradient

Я нигде не могу найти fillWithLinearGradient в модуле, поэтому я немного смущен.

Заранее благодарю за любую помощь! Роб


person throb    schedule 01.02.2016    source источник
comment
Ознакомьтесь с реализацией ChartFill: github.com /danielgindi/ios-charts/blob/ Есть инициализация, которая принимает linearGradient и angle. Я считаю, что ответ @matt правильный.   -  person Stephen    schedule 01.02.2016
comment
@Stephen, в классе LineChartDataSet нет .fill. Однако есть fillFormatter, но явно в моем нубском состоянии, я не уверен, как заставить это работать.   -  person throb    schedule 01.02.2016
comment
LineChartDataSet является подклассом LineRadarChartDataSet. LineRadarChartDataSet имеет общедоступную переменную заполнения, поэтому она должна быть вам доступна.   -  person Stephen    schedule 01.02.2016
comment
Привет, извините, у меня тот же вопрос, а что в вашем коде означает set1?   -  person VAAA    schedule 10.05.2016


Ответы (5)


Это отлично работает (Swift 3.1 и ios-charts 3.0.1)


let gradientColors = [UIColor.cyan.cgColor, UIColor.clear.cgColor] as CFArray // Colors of the gradient
let colorLocations:[CGFloat] = [1.0, 0.0] // Positioning of the gradient
let gradient = CGGradient.init(colorsSpace: CGColorSpaceCreateDeviceRGB(), colors: gradientColors, locations: colorLocations) // Gradient Object
yourDataSetName.fill = Fill.fillWithLinearGradient(gradient!, angle: 90.0) // Set the Gradient
set.drawFilledEnabled = true // Draw the Gradient

Результат

введите описание изображения здесь

person Michael    schedule 25.05.2016
comment
Как получить изогнутый эффект на графике? - person Kirit Vaghela; 10.07.2017
comment
@KiritVaghela Я точно не помню, вам придется проверить документацию, чтобы найти это. (github.com/danielgindi/Charts). Возможно, вам потребуется использовать параметр cubic или параметр bezier. - person Michael; 10.07.2017
comment
@KiritVaghela yourSet.mode = .cubicBezier // график с плавной линией - person Włodzimierz Woźniak; 01.08.2017
comment
Я новичок в диаграммах... как реализовать этот код с линейными диаграммами? - person jayant rawat; 17.03.2020

Я считаю, что это код, который вы ищете. Вы должны иметь возможность использовать тот же класс ChartFill в Swift для установки set1.fill.

let gradColors = [UIColor.cyanColor().CGColor, UIColor.clearColor.CGColor]
let colorLocations:[CGFloat] = [0.0, 1.0]
if let gradient = CGGradientCreateWithColors(CGColorSpaceCreateDeviceRGB(), gradColors, colorLocations) {
    set1.fill = ChartFill(linearGradient: gradient, angle: 90.0)
}
person Stephen    schedule 01.02.2016
comment
Спасибо. Я не подумал поставить это в {}. Однако, когда я использую ChartFill, я получаю сообщение об ошибке: неразрешенный идентификатор «ChartFill» - person throb; 02.02.2016
comment
это должно быть ChartFill.fillWithLinearGradient(...) - person jtmwanakhu; 17.03.2016
comment
Привет, что означает set1? - person VAAA; 10.05.2016
comment
@VAAA: в этом примере set1 было просто именем переменной. - person Stephen; 11.05.2016

Для Swift 5 используйте следующее:

yourDataSetName.fill = LinearGradientFill(....
or
yourDataSetName.fill = ColorFill(...

Более подробную информацию вы можете прочитать здесь: Графики

person Ihor Chernysh    schedule 17.11.2020

Для Swift4

let colorTop =  UIColor(red: 255.0/255.0, green: 149.0/255.0, blue: 0.0/255.0, alpha: 1.0).cgColor
let colorBottom = UIColor(red: 255.0/255.0, green: 94.0/255.0, blue: 58.0/255.0, alpha: 1.0).cgColor

let gradientColors = [colorTop, colorBottom] as CFArray
let colorLocations:[CGFloat] = [0.0, 1.0]
let gradient = CGGradient.init(colorsSpace: CGColorSpaceCreateDeviceRGB(), colors: gradientColors, locations: colorLocations) // Gradient Object
yourDataSetName.fill = Fill.fillWithLinearGradient(gradient!, angle: 90.0)
person Hardik Thakkar    schedule 16.10.2018
comment
похоже, вам также нужно добавить yourDataSetName.drawFilledEnabled = true - person kite_n_code; 14.12.2018

Обязательно используйте последнюю версию ios-charts. Если вы используете CocoaPods для установки ios-charts, измените это:

pod 'Charts'

к этому

pod 'Charts', '~> 2.2'
person cronenberg    schedule 10.02.2016
comment
Мне просто нужно было дождаться этой версии, я думаю :) Я все еще не получаю градиентную заливку, но, по крайней мере, ошибка не поднимает свою уродливую голову. Спасибо. - person throb; 25.02.2016
comment
@throb вы, вероятно, уже решили это, но на всякий случай: я скопировал ваш код и тоже не получил градиент, и оказалось, что проблема заключалась в том, что второй цвет не был отправлен как .CGColor. Добавление этого решило это для меня. пусть gradColors = [UIColor.cyanColor().CGColor, UIColor.init(красный: 0,0, зеленый: 0,0, синий: 0,0, альфа: 0,0).CGColor] - person ClockWise; 11.03.2016
comment
Сладкий! Спасибо! В итоге я не использовал градиент, но теперь буду :) Ура!! - person throb; 11.03.2016