2016-04-04 19 views
-2

Bazı UI öğelerinde kullanılması gereken "rgb (0,0,0)" gibi bir biçimde sunucudan bir dizem var."rgb (0,0,0)" gibi bir String’ten UIColor nasıl oluşturulur?

temel sorun "rgb (20,120,4)" gibi çeşitli renklerde vb

UIColor(red: 0, green: 0, blue: 0, alpha: 1) gibi bir şey bunu ayrıştırmak için bir yolu var mı?

+0

sunucu kodu döndürülür? Dize? lütfen daha fazla kod gönderin, böylece size yardımcı olabilirim – Eric

+0

@Eric yeah, String. –

+0

Sadece ilk karakterlerden bahsederdim, ancak bunu yapmak çok iyi değil, size bunu nasıl yapacağımı göstereyim mi? – Eric

cevap

5

kadar çok olası çözüm vardır olabilir! İşte bir NSScanner kullanıyor:

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) 
    } 
} 

Kullanım örneği:

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

Güncelleme Swift 3/4 için: Hangi formatta

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

Bunu deneyebilirsiniz. Burada

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) 

Sonuç: Burada

enter image description here

+0

Uzantıları kullanmak için güzel çözümler! – Eric

+0

bu kod çalışmaz. "Int" renk oluşturucu için yanlış bir tiptir, 1 basamaktan daha fazla renk koduyla başarısız olur veya hatalı biçimlendirilmiş bir dize – OgreSwamp

+0

alırsanız İşaretlediğiniz ikinci sorunu düzeltmediniz (rgb değerlerinin ikiye bölünmesi gerekir) 255 'UIColor' başlatıcısı için 0 ile 1 arasında olmalıdır. – dan

2

UIColor için dize dönüştürecek olan bir yöntemdir. Muhtemelen regex ile daha iyi bir çözüm var, ama ben düzenli olarak oldukça kötüyüm.

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 
    } 
} 

ve oyun alanı downloaded here

+0

Ayrıca, boşlukların etrafındaki boşlukların doğru ayrılmayacağından, tek tek dizelere ayırdıktan sonra boşluk karakterlerini de kırpmak isteyebilirsiniz. – OgreSwamp

İlgili konular