"rgb(0,0,0)"のような形式のサーバーからの文字列をいくつかのUI要素で使用する必要があります。"rgb(0,0,0)"のような文字列からUIColorを作成するには?
主な問題は、「RGB(20,120,4)」などの様々な色であるなど
UIColor(red: 0, green: 0, blue: 0, alpha: 1)
のようなもので、それを解析する方法はありますか?
"rgb(0,0,0)"のような形式のサーバーからの文字列をいくつかのUI要素で使用する必要があります。"rgb(0,0,0)"のような文字列からUIColorを作成するには?
主な問題は、「RGB(20,120,4)」などの様々な色であるなど
UIColor(red: 0, green: 0, blue: 0, alpha: 1)
のようなもので、それを解析する方法はありますか?
非常に多くの可能な解決策がありますすることができます!
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)
}
}
これを試すことができます。ここ
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)
結果:ここで
は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
数字の周囲の空白が正しく解析されないため、個々の文字列に分割した後に空白文字をトリミングすることもできます。 – OgreSwamp
サーバーがコードを返しますか?文字列?もう少しコードを投稿してください。 – Eric
@Eric yeah、String。 –
私は最初の文字を削除するだけですが、これはあまり良いことではありませんが、その方法を教えてください。 – Eric