2011-12-31 9 views
7

UIColorを16進数値に変換する簡単な方法はありますか?
または、CGColorGetComponentsでRGBコンポーネントを取得してからそこから作業する必要がありますか?UIColorから16進数(ウェブカラー)

たとえばCGColorGetComponents(color.CGColor)[0] * 256

答えて

7

Erica SadunのUIColorカテゴリを使用することを検討します。これには、16進表記を含む多くの機能が無料で含まれています。使い方はとても簡単です。使用しているクラスヘッダーに追加するか、あらかじめコンパイルされたヘッダーに追加して、究極の柔軟性を実現してください。 あなたはこのようなものに非常に似た操作を行い、プリコンパイルされたヘッダに追加している場合:https://github.com/erica/uicolor-utilities

#ifdef __OBJC__ 
    #import <Foundation/Foundation.h> 
    #import <UIKit/UIKit.h> 
    #import "UIColor-Expanded.h" 
#endif 

その後、あなたはUIColorのカテゴリにとてもNSLog(@"%@", [myColor hexStringFromColor]);

GitHubのリンクのようにそれを使用することができます

についてのArsTechnicaの記事:http://arstechnica.com/apple/guides/2009/02/iphone-development-accessing-uicolor-components.ars

+0

素晴らしいライブラリとして出てきます。これに感謝します。 – fes

+0

問題ありません。それがあなたのために働くことを望みます! – lewiguez

1

私が知る限り、組み込みのソリューションはありません。
ただし、256の代わりに255を乗算する必要があります。

16進表現を取得するのは簡単な作業なので、手動で文字列を作成する際には多くの問題がありません。

NSLog(@"%X%X%X", redInteger, greenInteger, blueInteger); 
+0

私はそれを行う巧妙な方法だと思います。コンポーネントは浮動小数点数を返すので、それをどのようにして整数に正確に変換できますか?たとえば、紫色の場合:UIDeviceRGBColorSpace 0.548638 0.554697 1 1 – fes

+0

結果をキャストまたは丸めて整数にし、テスト済みのRGB 0.548638 0.554697 1、切り捨て、丸めを行い、同じ*紫の色を毎回与えます。 –

+0

切り捨てと丸めの例を教えてもらえますか?たぶん私は高すぎる丸めですが、私は常に1を得て、%X%X%Xは111 – fes

9

また、UIColorをその16進数のコンポーネントに変換する必要がありました。

すでにlewiguezによって指摘されているように、すべてのものを行うgithubに非常に良いカテゴリがあります。

私はそれがどのように行われたかを知りたかったので、私は自分の単純なRGBカラーの実装を行いました。

+ (NSString*)colorToWeb:(UIColor*)color 
{ 
    NSString *webColor = nil; 

    // This method only works for RGB colors 
    if (color && 
     CGColorGetNumberOfComponents(color.CGColor) == 4) 
    { 
     // Get the red, green and blue components 
     const CGFloat *components = CGColorGetComponents(color.CGColor); 

     // These components range from 0.0 till 1.0 and need to be converted to 0 till 255 
     CGFloat red, green, blue; 
     red = roundf(components[0] * 255.0); 
     green = roundf(components[1] * 255.0); 
     blue = roundf(components[2] * 255.0); 

     // Convert with %02x (use 02 to always get two chars) 
     webColor = [[NSString alloc]initWithFormat:@"%02x%02x%02x", (int)red, (int)green, (int)blue]; 
    } 

    return webColor; 
} 

フィードバックはすべて歓迎です!

+0

このメソッドは完全に動作します、ありがとう! – BFeher

2

広く使用されている文字列ベースのソリューション以外は、ここでは16進(整数)ベースのソリューションです。使用法:

UIColor* color = lf_rgb(0x120aef); 
log(@"color %.6x", color.hex_rgb); 

「カラー120aef」と表示されます。私はスウィフト3でそれをやったんかこれは

#define lf_rgb(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] 

@interface UIColor (lc_rgb) 
- (NSInteger)hex_rgb; 
@end 

@implementation UIColor (lc_rgb) 
- (NSInteger)hex_rgb 
{ 
    CGFloat r, g, b, a; 
    BOOL result = [self getRed:&r green:&g blue:&b alpha:&a]; 
    // log(@"rgba: %f, %f, %f, %f", r * 255, g * 255, b * 255, a * 255); 
    if ((result == NO) || (a != 1.0f)) 
     return -1; 
    return 
     (NSInteger)(r * 255) * 256 * 256 + 
     (NSInteger)(g * 255) * 256 + 
     (NSInteger)(b * 255) * 1; 
} 
@end 
0

:私はhttps://github.com/superarts/LCategoryでこれらのコードを入れます、またはあなたもあなた自身のコードバンクにコピー&ペーストすることができます

extension UIColor { 
    var hex:String{ 
     get{ 
      var red:CGFloat = 0 
      var blue:CGFloat = 0 
      var green:CGFloat = 0 
      var alpha:CGFloat = 0 

      self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) 
      let rgb:Int = (Int)(red*255)<<16 | (Int)(green*255)<<8 | (Int)(blue*255)<<0 
      return String.localizedStringWithFormat("#%06x", rgb) 
     } 
    } 
} 

またはあなたができますそれを方法にする。私はちょうどがどのように見えるのか、color.hex()が好きです。