2016-06-02 11 views
0

Я тестировал CAGradientLayer для создания цветов градиента для iOS и Mac OS X (Cocoa). Например, у меня есть следующие строки кода для создания цветов градиента для iOS.Создание массива CGColors из массива UIColors или NSColors

let gradient: CAGradientLayer = CAGradientLayer() 
gradient.frame = view.bounds 
gradient.colors = [UIColor.orangeColor().CGColor,UIColor.redColor().CGColor] 
gradient.locations = [0.1,0.9] 
self.view.layer.insertSublayer(gradient,atIndex:0) 

Теперь, что у меня есть массив цветов (UIColor или NSColor), в зависимости от платформы разработки. Если я создаю массив, содержащий UIColor (или NSColor) объекты программно, начиная с

var cArray = [UIColor]() 

или

var cArray = [NSColor]() 

, как я могу создать массив, содержащий CGColors с ними? Я думаю, что this topic может быть связано. Одна из проблем заключается в том, что я не знаю, как объявить и инициализировать массив объектов CGColor.

Спасибо

+0

Вы можете использовать HTTP: // StackOverflow .com/questions/24065017/how-to-define-device-type-from-swift-os-x-or-ios, чтобы знать, на какой платформе вы находитесь, и, возможно, объект, который будет обрабатывать правильный цвет: 'MyCustomObjectColor.redColor(). CGColor' – Larme

+1

Как насчет простой карты:' let cgcolors = uicolors.map {$ 0.CGColor} '? - Также рассмотрите использование 'SKColor' в качестве независимого от платформы псевдонима либо' UIColor', либо 'NSColor'. –

ответ

2

Вы можете сделать:

extension _ArrayType where Generator.Element == UIColor { 
    func CGColors() -> [CGColorRef] { 
     var cgColorArray: [CGColorRef] = [] 

     for color in self { 
      cgColorArray.append(color.CGColor) 
     } 

     return cgColorArray 
    } 
} 

Используйте его так:

let colors: [UIColor] = [UIColor.redColor(), UIColor.orangeColor()] 
colors.CGColors() 

Repeat для NSColor.

+0

Спасибо. Но как вы собираетесь объявлять и инициализировать массив объектов CGColor? –

+0

'var cgColorArray: [CGColorRef] = []' – Andrew

+0

К сожалению, извините ... Правильно ... Я получаю сообщение об ошибке при возврате cgColorArray. –

4

Я также хотел бы дать функцию map некоторое внимание.

let colors: [UIColor] = [UIColor.redColor(), UIColor.orangeColor()] 
    let cgColors: [CGColor] = colors.map({ $0.CGColor }) 

map применяет замыкание к каждому элементу массива и возвращает его.

$0 является первым (и единственным) параметром для закрытия.

Это на самом деле сокращение для:

let cgColors: [CGColor] = colors.map({ return $0.CGColor }) 

, который является обобщающим для:

let cgColors: [CGColor] = colors.map({ 
     color: in 
     return color.CGColor 
    }) 

, который является обобщающим для:

let cgColors: [CGColor] = colors.map({ 
     (color: UIColor) in 
     return color.CGColor 
    }) 
+0

Хорошо. Спасибо, что показал мне что-то новое. Но я еще не вижу, как это связано с созданием массива объектов CGColor. –

+2

Как это не связано? Это фактическое создание массива CGColor. Без необходимости расширения. – netigger

+0

Какая строка показывает массив объектов CGColor, пожалуйста? colors.map ({$ 0.CGColor})? –

 Смежные вопросы

  • Нет связанных вопросов^_^