2016-04-04 5 views
-2

"rgb(0,0,0)"のような形式のサーバーからの文字列をいくつかのUI要素で使用する必要があります。"rgb(0,0,0)"のような文字列からUIColorを作成するには?

主な問題は、「RGB(20,120,4)」などの様々な色であるなど

UIColor(red: 0, green: 0, blue: 0, alpha: 1)のようなもので、それを解析する方法はありますか?

+0

サーバーがコードを返しますか?文字列?もう少しコードを投稿してください。 – Eric

+0

@Eric yeah、String。 –

+0

私は最初の文字を削除するだけですが、これはあまり良いことではありませんが、その方法を教えてください。 – Eric

答えて

5

非常に多くの可能な解決策がありますすることができます!

extension UIColor { 
    convenience init?(rgbString : String) { 
     var red = 0.0 
     var green = 0.0 
     var blue = 0.0 

     let scanner = NSScanner(string : rgbString) 
     guard scanner.scanString("rgb(", intoString: nil) 
      && scanner.scanDouble(&red) 
      && scanner.scanString(",", intoString: nil) 
      && scanner.scanDouble(&green) 
      && scanner.scanString(",", intoString: nil) 
      && scanner.scanDouble(&blue) 
      && scanner.scanString(")", intoString: nil) else { 
       return nil 
     } 
     self.init(red: CGFloat(red/255.0), green: CGFloat(green/255.0), blue: CGFloat(blue/255.0), alpha: 1.0) 
    } 
} 

使用例:ここでは NSScannerを使用して1であるスウィフト3/4

if let col = UIColor(rgbString: "rgb(20,120.5, 4)") { 
    print(col) 
} else { 
    print("invalid color specification") 
} 

アップデート:どのような形式で

extension UIColor { 
    convenience init?(rgbString: String) { 
     var red = 0.0 
     var green = 0.0 
     var blue = 0.0 

     let scanner = Scanner(string: rgbString) 
     guard scanner.scanString("rgb(", into: nil) 
      && scanner.scanDouble(&red) 
      && scanner.scanString(",", into: nil) 
      && scanner.scanDouble(&green) 
      && scanner.scanString(",", into: nil) 
      && scanner.scanDouble(&blue) 
      && scanner.scanString(")", into: nil) else { 
       return nil 
     } 
     self.init(red: CGFloat(red/255.0), green: CGFloat(green/255.0), blue: CGFloat(blue/255.0), alpha: 1.0) 
    } 
} 
1

これを試すことができます。ここ

import UIKit 

let string1 = "rgb(25.00,100.0,100)" 

let indexToRemoveTheLast = string1.endIndex.advancedBy(-1) 
let substring1 = string1.substringToIndex(indexToRemoveTheLast) 
let indexToRemoveTheFirst = string1.startIndex.advancedBy(4) 
let substring2 = substring1.substringFromIndex(indexToRemoveTheFirst) 

var colorsString = substring2.characters.split{$0 == ","}.map(String.init) 
let red = (Float(colorsString[0])!)/255 
let green = (Float(colorsString[1])!)/255 
let blue = (Float(colorsString[2])!)/255 

let myColor = UIColor(red: CGFloat(red), green: CGFloat(green), blue: CGFloat(blue), alpha: 1) 

結果:ここで

enter image description here

+0

拡張機能を使用するための素晴らしいソリューション! – Eric

+0

そのコードは機能しません。 'Int'はカラーコンストラクタのタイプが間違っています.1桁以上のカラーコードで失敗するか、形式が正しくない文字列を受け取った場合 – OgreSwamp

+0

私が指摘した2番目の問題は修正されませんでした(rgbの値は'UIColor'イニシャライザの場合、255を0と1の間にしてください) – dan

2

UIColorにあなたの文字列を変換します方法です。おそらく正規表現でより良い解決策がありますが、私は正規表現ではかなり悪いです。

func colorFromString(colorString: String) -> UIColor? { 
    // strip down rgb and parenthesis 
    let combinedCharacterSet = NSMutableCharacterSet.letterCharacterSet() 
    combinedCharacterSet.addCharactersInString("()") 

    let trimmedString = colorString.stringByTrimmingCharactersInSet(combinedCharacterSet) 
    let rgbValueStrings = trimmedString.componentsSeparatedByString(",") 

    if rgbValueStrings.count != 3 { 
     return nil 
    } 

    if let r = Double(rgbValueStrings[0]) where r >= 0 && r <= 255, 
     let g = Double(rgbValueStrings[1]) where g >= 0 && g <= 255, 
     let b = Double(rgbValueStrings[2]) where b >= 0 && b <= 255 { 
     return UIColor(red: CGFloat(r/255), green: CGFloat(g/255), blue: CGFloat(b/255), alpha: 1.0) 
    } else { 
     return nil 
    } 
} 

や遊び場downloaded here

+0

数字の周囲の空白が正しく解析されないため、個々の文字列に分割した後に空白文字をトリミングすることもできます。 – OgreSwamp

関連する問題