ios - 進数 - UIColorをHEXに変換してNSLogに表示する方法




uicolor 初期 化 (6)

最後に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)
            )
        }
    }
}

UIColorコードを16進数に変換する方法についていくつかのリンクを調べましたが、NSLogでそれらを表示する方法を呼び出す方法についてはわかりません。 私は質問に私の最後の手段であるので、投稿する評判を得ていない。 私はログに私のアプリを実行するときに表示させたい。

次に、RGB色番号(R = 30、G = 171、B = 13)はどこに入力しますか? 私は、すべての例で、通常インデックス位置を参照するArray [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)];

}

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

uicolorの16進数の色

HEX RGBカラーコードをUIColorに変換するには?

私はviewDidLoadでメソッドを呼び出そうとしましたが、UIColorなしでは動作しません。 私はそれが何か簡単だと確信しています。

答える人に感謝します。

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


Kampaiの回答はRGBカラーでは機能しますが、モノクロでは機能しません(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)];
}

アルファを扱うときの潜在的な罠 :HEX文字列は異なるフォーマットであり、いくつかはアルファベットを16進文字列の先頭に付け、他のフォーマットは最後にそれを持っています。 背景に応じて、16進数文字列のフォーマット方法が異なる場合があります。 Android開発者にとっては、当初はアルファを使用している可能性があります。ウェブ開発者にとっては、文字列の最後にある可能性が高いからです。 それでは 、混乱を避けるために、 必ず六角形の書式記入してください。 Androidの16進数文字列は、最初にアルファベットを入力する必要があります。 だから、それは人々が16進文字列(私がやった)に来るときに落ちるかもしれないトラップなので、期待されるフォーマットが何であるかを言うことが重要です。 だから、もしあなたがiOSとAndroidの両方のアプリを開発しているなら、このトラップには何が出ているのですか?

リンク:なぜHEX文字列が異なる方法でフォーマットされるのかについての詳細は、 https://en.wikipedia.org/wiki/RGBA_color_spacehttps://en.wikipedia.org/wiki/RGBA_color_spaceを参照してください。 Androidのリンクhttps://developer.android.com/reference/android/graphics/Color.htmlhttps://gist.github.com/lopspower/03fb1cc0ac9f32ef38f4

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

(注: color == null場合は黒が返されます)。

+(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)
            ];

}

スウィフト2の回答がスウィフト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))
}

受け入れられた答えの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))
    }
}

白のようなUIColorsの他のSwiftの応答は、CGColorによって返されるコンポーネントが2つしかない場合にクラッシュします。

ここには、その問題を持たない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
    }
}






uicolor