2012-04-25 5 views

ответ

35

Я нашел несколько решений для Objective C, и никто конкретно для MonoTouch я в конечном итоге разработки метода расширения на основе наиболее популярного решения для IOS:

public static class UIColorExtensions 
    { 
     public static UIColor FromHex(this UIColor color,int hexValue) 
     { 
      return UIColor.FromRGB(
       (((float)((hexValue & 0xFF0000) >> 16))/255.0f), 
       (((float)((hexValue & 0xFF00) >> 8))/255.0f), 
       (((float)(hexValue & 0xFF))/255.0f) 
      ); 
     } 
    } 

и использовать его как это:

new UIColor().FromHex(0x4F6176); 

Обновление, кажется, что от Monotouch 5.4 UIColor не имеет конструктора без параметров, поэтому используйте его следующим образом:

UIColor.Clear.FromHex(0xD12229); 
+0

Куда вы это положили? Создаете ли вы новый класс 'UIColorExtensions'? – testing

+0

Не могу ли я просто сделать что-то вроде категории в Objective-C? –

+0

alexcons answer: https://stackoverflow.com/a/41046485/2539616 ... ниже - тот, который ... Color.FromHex ("# 00FF00"). ToUIColor(); – Adam

27

Вот один, который позволяет использовать строку как в CSS:

UIColor textColorNormal = UIColor.Clear.FromHexString("#f4f28d", 1.0f); 

А вот класс:

using System; 
using System.Drawing; 

using MonoTouch.Foundation; 
using MonoTouch.UIKit; 
using System.Globalization; 

namespace YourApp 
{ 
    public static class UIColorExtensions 
    { 
     public static UIColor FromHexString (this UIColor color, string hexValue, float alpha = 1.0f) 
     { 
      var colorString = hexValue.Replace ("#", ""); 
      if (alpha > 1.0f) { 
       alpha = 1.0f; 
      } else if (alpha < 0.0f) { 
       alpha = 0.0f; 
      } 

      float red, green, blue; 

      switch (colorString.Length) 
      { 
       case 3 : // #RGB 
       { 
        red = Convert.ToInt32(string.Format("{0}{0}", colorString.Substring(0, 1)), 16)/255f; 
        green = Convert.ToInt32(string.Format("{0}{0}", colorString.Substring(1, 1)), 16)/255f; 
        blue = Convert.ToInt32(string.Format("{0}{0}", colorString.Substring(2, 1)), 16)/255f; 
        return UIColor.FromRGBA(red, green, blue, alpha); 
       } 
       case 6 : // #RRGGBB 
       { 
        red = Convert.ToInt32(colorString.Substring(0, 2), 16)/255f; 
        green = Convert.ToInt32(colorString.Substring(2, 2), 16)/255f; 
        blue = Convert.ToInt32(colorString.Substring(4, 2), 16)/255f; 
        return UIColor.FromRGBA(red, green, blue, alpha); 
       } 

       default : 
         throw new ArgumentOutOfRangeException(string.Format("Invalid color value {0} is invalid. It should be a hex value of the form #RBG, #RRGGBB", hexValue)); 

      } 
     } 
    } 
} 
+0

Супер полезный! Я общаюсь с веб-сервисом, который хранит все точно так же, как css. Благодарим за сообщение! – BRogers

+0

Не беспокойтесь, это было весело! – superlogical

+1

Ответ alexcons: https://stackoverflow.com/a/41046485/2539616 ... ниже - тот, который ... Color.FromHex ("# 00FF00"). ToUIColor(); – Adam

16

Может быть, это поможет вам, если вы используете Xamarin.Forms:

using Xamarin.Forms; 
using Xamarin.Forms.Platform.iOS; 

... 
Color.FromHex("#00FF00").ToUIColor(); 
+0

Это должен быть принятый ответ, нет необходимости изобретать велосипед. – MonkeyCoder

+0

Во-вторых, это ответ. Создание класса для этого - излишний. Но тогда это было с 2012 года. – Adam

+0

Это полезно для xamarin.forms, но если вы работаете в xamarin.ios, то вытащить библиотеки платформы из xamarin.forms я не буду делать. –

1

в качестве опции, например

public static UIColor FromHEX(string hex) 
    { 
     int r = 0, g = 0, b = 0, a = 0; 

     if (hex.Contains("#")) 
      hex = hex.Replace("#", ""); 

     switch (hex.Length) 
     { 
      case 2: 
       r = int.Parse(hex, System.Globalization.NumberStyles.AllowHexSpecifier); 
       g = int.Parse(hex, System.Globalization.NumberStyles.AllowHexSpecifier); 
       b = int.Parse(hex, System.Globalization.NumberStyles.AllowHexSpecifier); 
       a = 255; 
       break; 
      case 3: 
       r = int.Parse(hex.Substring(0, 1), System.Globalization.NumberStyles.AllowHexSpecifier); 
       g = int.Parse(hex.Substring(1, 1), System.Globalization.NumberStyles.AllowHexSpecifier); 
       b = int.Parse(hex.Substring(2, 1), System.Globalization.NumberStyles.AllowHexSpecifier); 
       a = 255; 
       break; 
      case 4: 
       r = int.Parse(hex.Substring(0, 1), System.Globalization.NumberStyles.AllowHexSpecifier); 
       g = int.Parse(hex.Substring(1, 1), System.Globalization.NumberStyles.AllowHexSpecifier); 
       b = int.Parse(hex.Substring(2, 1), System.Globalization.NumberStyles.AllowHexSpecifier); 
       a = int.Parse(hex.Substring(3, 1), System.Globalization.NumberStyles.AllowHexSpecifier); 
       break; 
      case 6: 
       r = int.Parse(hex.Substring(0, 2), System.Globalization.NumberStyles.AllowHexSpecifier); 
       g = int.Parse(hex.Substring(2, 2), System.Globalization.NumberStyles.AllowHexSpecifier); 
       b = int.Parse(hex.Substring(4, 2), System.Globalization.NumberStyles.AllowHexSpecifier); 
       a = 255; 
       break; 
      case 8: 
       r = int.Parse(hex.Substring(0, 2), System.Globalization.NumberStyles.AllowHexSpecifier); 
       g = int.Parse(hex.Substring(2, 2), System.Globalization.NumberStyles.AllowHexSpecifier); 
       b = int.Parse(hex.Substring(4, 2), System.Globalization.NumberStyles.AllowHexSpecifier); 
       a = int.Parse(hex.Substring(6, 2), System.Globalization.NumberStyles.AllowHexSpecifier); 
       break; 
     } 

     return UIColor.FromRGBA(r, g, b, a); 
    } 
Смежные вопросы