web-dev-qa-db-ja.com

UIColorをHEXに変換してNSLogで表示する方法

UIColorコードをHEXに変換する方法に関するいくつかのリンクを確認しましたが、NSLogでそれらを表示するメソッドを呼び出す方法についてはわかりません。私はコメントする評判を得ていないので、質問として投稿することが私の最後の手段です。 ログでアプリを実行するときに表示したい

次に、RGBカラー番号を入力する場所(R = 30、G = 171、B = 13)すべての例で、通常インデックス位置を参照する配列[0]、[1]、[2]を使用していることがわかります。そこで、色の値をどこに追加しますか?

私はこのコードを持っています:

- (NSString *) hexFromUIColor:(UIColor *)color {

    if (CGColorGetNumberOfComponents(color.CGColor) < 4) {
        const CGFloat *components = CGColorGetComponents(color.CGColor);
        color = [UIColor colorWithRed:components[30] green:components[141] blue:components[13] alpha:components[1]];
    }
    if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) != kCGColorSpaceModelRGB) {
        return [NSString stringWithFormat:@"#FFFFFF"];
    }
    return [NSString stringWithFormat:@"#%02X%02X%02X", (int)((CGColorGetComponents(color.CGColor))[0]*255.0), (int)((CGColorGetComponents(color.CGColor))[1]*255.0), (int)((CGColorGetComponents(color.CGColor))[2]*255.0)];

}

私がチェックしたリンク:

icolorの16進数の色

HEX RGBカラーコードをUIColorに変換する方法

私はviewDidLoadでメソッドを呼び出そうとしましたが、UIColorなしでは機能しません。簡単なものだと思います。

答えてくれた人に感謝します。

NSLogに表示するためにこのメソッドを呼び出すためにviewDidLoadで使用するコードは何ですか?

37
App Dev Guy

以下のコードを使用:

- (NSString *)hexStringFromColor:(UIColor *)color {
    const CGFloat *components = CGColorGetComponents(color.CGColor);

    CGFloat r = components[0];
    CGFloat g = components[1];
    CGFloat b = components[2];

    return [NSString stringWithFormat:@"#%02lX%02lX%02lX",
            lroundf(r * 255),
            lroundf(g * 255),
            lroundf(b * 255)];
}

16進コード文字列を取得した後、以下のメソッドを呼び出してUIColorを取得します

- (UIColor *) colorWithHexString: (NSString *) hexString
{
    NSString *colorString = [[hexString stringByReplacingOccurrencesOfString: @"#" withString: @""] uppercaseString];

    NSLog(@"colorString :%@",colorString);
    CGFloat alpha, red, blue, green;

    // #RGB
    alpha = 1.0f;
    red   = [self colorComponentFrom: colorString start: 0 length: 2];
    green = [self colorComponentFrom: colorString start: 2 length: 2];
    blue  = [self colorComponentFrom: colorString start: 4 length: 2];

    return [UIColor colorWithRed: red green: green blue: blue alpha: alpha];
}

`

- (CGFloat) colorComponentFrom: (NSString *) string start: (NSUInteger) start length: (NSUInteger) length {
    NSString *substring = [string substringWithRange: NSMakeRange(start, length)];
    NSString *fullHex = length == 2 ? substring : [NSString stringWithFormat: @"%@%@", substring, substring];
    unsigned hexComponent;
    [[NSScanner scannerWithString: fullHex] scanHexInt: &hexComponent];
    return hexComponent / 255.0;
}

使用法

// ( R = 30, G = 171, B = 13)? 
CGFloat red = 30.0;
CGFloat green = 171.0;
CGFloat blue = 13.0; 
CGFloat alpha = 255.0
UIColor *color = [UIColor colorWithRed:(red/255.0) green:(green/255.0) blue:(blue/255.0) alpha:(alpha/255.0)];
NSString *colorCode = [self hexStringFromColor:color];
NSLog(@"Color Code: %@", colorCode);

UIColor *resultColor = [self colorWithHexString:colorCode];
53
Kampai

Kampaiの答えはRGBカラーで機能しますが、モノクロ(UIColor colorWithWhite:alpha :)では機能しません。また、HEXがサポートするアルファを処理しません。次に、hexStringFromColorのわずかに変更されたバージョンを示します。

+ (NSString *)hexStringFromColor:(UIColor *)color
{
    CGColorSpaceModel colorSpace = CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor));
    const CGFloat *components = CGColorGetComponents(color.CGColor);

    CGFloat r, g, b, a;

    if (colorSpace == kCGColorSpaceModelMonochrome) {
        r = components[0];
        g = components[0];
        b = components[0];
        a = components[1];
    }
    else if (colorSpace == kCGColorSpaceModelRGB) {
        r = components[0];
        g = components[1];
        b = components[2];
        a = components[3];
    }

    return [NSString stringWithFormat:@"#%02lX%02lX%02lX%02lX",
            lroundf(r * 255),
            lroundf(g * 255),
            lroundf(b * 255),
            lroundf(a * 255)];
}
22
Jeff

そして最後にalpha-componentで動作し、正しい乗数を使用するバージョン

extension UIColor {
    var hexString: String? {
        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        var alpha: CGFloat = 0

        let multiplier = CGFloat(255.999999)

        guard self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) else {
            return nil
        }

        if alpha == 1.0 {
            return String(
                format: "#%02lX%02lX%02lX",
                Int(red * multiplier),
                Int(green * multiplier),
                Int(blue * multiplier)
            )
        }
        else {
            return String(
                format: "#%02lX%02lX%02lX%02lX",
                Int(red * multiplier),
                Int(green * multiplier),
                Int(blue * multiplier),
                Int(alpha * multiplier)
            )
        }
    }
}
20

その他Swift=クラッシュに答える CGColorによって返されるコンポーネントが2つしかない白のようなUIColors.

これはSwift 4バージョンで、この問題はありません。また、必要な場合は文字列の最後に透明度情報を返します(Web形式)。

例えば:

は戻ります#FFFFFF

不透明度50%の白は戻ります#FFFFFF7F

extension UIColor {
    var hexString: String {
        let colorRef = cgColor.components
        let r = colorRef?[0] ?? 0
        let g = colorRef?[1] ?? 0
        let b = ((colorRef?.count ?? 0) > 2 ? colorRef?[2] : g) ?? 0
        let a = cgColor.alpha

        var color = String(
            format: "#%02lX%02lX%02lX",
            lroundf(Float(r * 255)),
            lroundf(Float(g * 255)),
            lroundf(Float(b * 255))
        )

        if a < 1 {
            color += String(format: "%02lX", lroundf(Float(a)))
        }

        return color
    }
}
10
m_katsifarakis

Swiftでは、単にUIColorの拡張機能を作成しました...

extension UIColor
{

    var hexString:NSString {
        let colorRef = CGColorGetComponents(self.CGColor)

        let r:CGFloat = colorRef[0]
        let g:CGFloat = colorRef[1]
        let b:CGFloat = colorRef[2]

        return NSString(format: "#%02lX%02lX%02lX", lroundf(Float(r * 255)), lroundf(Float(g * 255)), lroundf(Float(b * 255)))
    }
}
7
Joel Kopelioff

受け入れられた回答のSwift 2バージョン。 UIColor拡張に変換しました。

extension UIColor {
    var hexString: String {
        let components = CGColorGetComponents(self.CGColor)

        let red = Float(components[0])
        let green = Float(components[1])
        let blue = Float(components[2])
        return String(format: "#%02lX%02lX%02lX", lroundf(red * 255), lroundf(green * 255), lroundf(blue * 255))
    }
}
3
Isuru

Androidの色が必要な場合、これは正しい順序です。アルファが最初になります:

extension UIColor {
    var hexString: String? {
        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        var alpha: CGFloat = 0

        let multiplier = CGFloat(255.999999)

        guard self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) else {
            return nil
        }

        if alpha == 1.0 {
            return String(
                format: "#%02lX%02lX%02lX",
                Int(red * multiplier),
                Int(green * multiplier),
                Int(blue * multiplier)
            )
        }
        else {
            return String(
                format: "#%02lX%02lX%02lX%02lX",
                Int(alpha * multiplier),
                Int(red * multiplier),
                Int(green * multiplier),
                Int(blue * multiplier)
            )
        }
    }
}

その後、次のように呼び出します:

debugPrint("testColor > ", self.testColor().hexString!)
1
MrG

アルファを処理する場合の潜在的なトラップ:HEX文字列にはさまざまな形式があり、16進数文字列の先頭にアルファがあり、他の形式では終わり。背景に応じて、16進文字列のフォーマット方法が異なる場合があります。 Android開発者の場合は、先頭にアルファが付きます。Web開発者の場合は、文字列の末尾になります。SO ALWAYS STATE THE混乱を避けるための16進文字列のフォーマット。Android開始時に16進文字列はアルファを持つ必要があります。 16進文字列(私がやった)になりますので、期待される形式が何であるかを言うことが重要です。したがって、iOSとAndroidこのトラップのために何のためにアプリを開発する場合.

リンク: https://en.wikipedia.org/wiki/RGBA_color_space HEX文字列がさまざまな方法でフォーマットされている理由の詳細については、先頭にアルファがある場合があります。 Androidリンク https://developer.Android.com/reference/Android/graphics/Color.html および https://Gist.github。 com/lopspower/03fb1cc0ac9f32ef38f4

注意してください#AARRGGBB16進文字列形式次のコードを使用して、Alphaが文字列の先頭にくるようにします。

(注:if color == null blackが返されます)。

+(NSString*)hexStringFromColor:(UIColor *)color
{

    CGFloat r = 0, g = 0, b = 0, a = 1;

    if (color) {
        [color getRed:&r green:&g blue:&b alpha:&a];
    }

    return [NSString stringWithFormat:@"#%02lX%02lX%02lX%02lX",
            lroundf(a * 255.0),
            lroundf(r * 255.0),
            lroundf(g * 255.0),
            lroundf(b * 255.0)
            ];

}
1
Grant Luck

Swift 2答えはSwift 3

var hexString: String {
    let components = self.cgColor.components

    let red = Float((components?[0])!)
    let green = Float((components?[1])!)
    let blue = Float((components?[2])!)
    return String(format: "#%02lX%02lX%02lX", lroundf(red * 255), lroundf(green * 255), lroundf(blue * 255))
}
1
Haris