2016-11-23 2 views
2

Я новичок в swift и iOS, и есть что-то, чего я не знаю, что мне делать.swift 3 convert string color to cgcolor

У меня есть цвета, поступающие от внутреннего интерфейса, и я хочу, чтобы преобразовать его в CGColor

"colors": [ 
     "6909A1", 
     "7552D1", 
     "59B0DC", 
     "62E3CC" 
     ], 

func drawGradient(colors: [CGColor]) { 
     addLayer(colors: colors) 
    } 

Что я должен делать здесь, чтобы передать CGColor массив после преобразования его из JSON. Не удалось найти правильное решение, как получить CGColor от простой строки

+2

Различные шаги: Посмотрите, как создать UIColor из шестнадцатеричной строки, то 'UIColor' обладает свойством 'CGColor' (это тот, который нужно использовать). – Larme

ответ

1

UInt имеет удобство Initializer для преобразования шестнадцатеричной строки в его шестнадцатеричное значение

func color(from hexString : String) -> CGColor 
{ 
    if let rgbValue = UInt(hexString, radix: 16) { 
    let red = CGFloat((rgbValue >> 16) & 0xff)/255 
    let green = CGFloat((rgbValue >> 8) & 0xff)/255 
    let blue = CGFloat((rgbValue  ) & 0xff)/255 
    return UIColor(red: red, green: green, blue: blue, alpha: 1.0).cgColor 
    } else { 
    return UIColor.black.cgColor 
    } 
} 

Теперь карту массив строк в массив цвета

let hexColors = ["6909A1", "7552D1", "59B0DC", "62E3CC"] 

let gradientColors = hexColors.map { color(from:$0) } 

или, альтернативно, в UIColor расширения

extension UIColor { 

    convenience init(hexString : String) 
    { 
     if let rgbValue = UInt(hexString, radix: 16) { 
      let red = CGFloat((rgbValue >> 16) & 0xff)/255 
      let green = CGFloat((rgbValue >> 8) & 0xff)/255 
      let blue = CGFloat((rgbValue  ) & 0xff)/255 
      self.init(red: red, green: green, blue: blue, alpha: 1.0) 
     } else { 
      self.init(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0) 
     } 
    } 
} 

let hexColors = ["6909A1", "7552D1", "59B0DC", "62E3CC"] 

let gradientColors = hexColors.map { UIColor(hexString:$0).cgColor } 
+0

Спасибо @vadian. Это именно то, что я ищу – pmb

1

Не слишком сложно, но возможность создавать объекты UIColor/CGColor из шестнадцатеричных строк не встроена в Swift. Однако вы можете просто поместить это расширение в свой проект, чтобы добавить его:

extension UIColor { 
    public convenience init?(hexString: String) { 
     let r, g, b, a: CGFloat 

     if hexString.hasPrefix("#") { 
      let start = hexString.index(hexString.startIndex, offsetBy: 1) 
      let hexColor = hexString.substring(from: start) 

      if hexColor.characters.count == 8 { 
       let scanner = Scanner(string: hexColor) 
       var hexNumber: UInt64 = 0 

       if scanner.scanHexInt64(&hexNumber) { 
        r = CGFloat((hexNumber & 0xff000000) >> 24)/255 
        g = CGFloat((hexNumber & 0x00ff0000) >> 16)/255 
        b = CGFloat((hexNumber & 0x0000ff00) >> 8)/255 
        a = CGFloat(hexNumber & 0x000000ff)/255 

        self.init(red: r, green: g, blue: b, alpha: a) 
        return 
       } 
      } 
     } 

     return nil 
    } 
} 

Тогда вы могли бы сделать что-то вроде этого, чтобы преобразовать шестнадцатеричный цвет массив в массив CGColor:

func convertColours() { 
    let stringColours = ["6909A1", 
         "7552D1", 
         "59B0DC", 
         "62E3CC"] 
    var colours = [CGColor]() 

    for stringColour in stringColours { 
     if let colour = UIColor(hexString: stringColour) { 
      colours.append(colour.cgColor) 
     } 
    }   
} 
0

Попробуйте этот способ

extension UIColor { 
    convenience init(red: Int, green: Int, blue: Int) { 
     self.init(red: CGFloat(red)/255.0, green: CGFloat(green)/255.0, blue: CGFloat(blue)/255.0, alpha: 1.0) 
    } 

    func color(with hex: Int) -> CGColor { 
     let color = UIColor(red:(hex >> 16) & 0xff, green:(hex >> 8) & 0xff, blue:hex & 0xff) 
     return color.cgColor 
    } 
} 
UIColor().color(with: Int(stringColours[0], radix: 16)!) 
UIColor().color(with: 0x333333)