1

赤/青/緑の値を取り、それらを使用して16進文字列を作成し、それを使用して色を返すカラークラスを設定しています。このように赤、青、緑の色を指定することで初期化できます

 Colour *col = [[Colour alloc] initWithRed:200 Green:100 Blue:05];

このメソッドの問題は、05のような値を渡すと、0が削除され、5だけが渡されるため、青が05ではなく5に設定されることです。有効な16進数を返すメソッド文字列はこれです

   -(NSString *)getHexString
    {
        NSString *hexString = [NSString stringWithFormat:@"#%x%x%x", iRed_i,iGreen_i,iBlue_i];
        hexString = [hexString uppercaseString];
        return hexString;
    }

正しいカラーコードを返すには、各数値に2つの値が必要ですが、0は削除されているため、誤った色が返されます。

色を作成するために使用するもう1つの方法は、次のような16進文字列で色オブジェクトを初期化することです。

Colour *colour = [[Colour alloc] initWithHex:@"#782402"];

次に、スキャナーを使用して3つの値を次のように分離します

if ([sHex_p hasPrefix:@"#"]) sHex_p = [sHex_p substringFromIndex:1];
            unsigned int outVal;
            NSString *sRed  = [sHex_p substringToIndex:2];
            NSScanner* scanner = [NSScanner scannerWithString:sRed];

            [scanner scanHexInt:&outVal];
            [self setRed:outVal];

            NSString *sGreen  = [[sHex_p substringFromIndex:2] substringToIndex:2];
            scanner = [NSScanner scannerWithString:sGreen];
            [scanner scanHexInt:&outVal];
            [self setGreen:outVal];

            NSString *sBlue = [sHex_p substringFromIndex:4];
            scanner = [NSScanner scannerWithString:sBlue];

            [scanner scanHexInt:&outVal];

            [self setBlue:outVal];
        }

しかし、同じ問題があります。16進文字列では、最後の2つの値は02ですが、intからstringに変換すると、その0が削除されるため、2だけが渡され、色が正しくなくなります。

これを解決する最善の方法が何であるか、私は本当に確信が持てません。誰かが正しい方向を指すことができれば本当にありがたいです。

私はここでこのサイトを使用してそれをテストしています

http://www.colorpicker.com/

簡単な例この16進文字列「#DB4200」を作成しようとしています。赤=219緑=66、青=00が必要です

ただし、文字列から整数に変換するときに青が0に設定されるだけで、誤った色が返されるため、16進文字列は「#DB420」になります。

4

1 に答える 1

1

まあ、これは実際には3つの異なる状況を伴います。まず、05は16進数と10進数の両方で5です。この場合の問題は入力ではなく、おそらく出力にあります。ただし、これは10進リテラルであることを忘れないでください。したがって、#101010 各色の255のうち16を意味する場合は、のような16進定数を使用して0x10ください。

第二に:出力について。使用しているフォーマット文字列は、各色に2桁の数字を強制しないため、はに05なります5%02xの代わりにを使用すると、整数(16進形式)の出力をゼロで埋められた2桁に強制できます%x

第三に、実際には最初です。メソッドは機能しているように見えますが、出力が間違っています。フォーマット文字列を修正すると、これを解決できるはずです。とにかく、これはを使用した代替バージョンsscanfです。

- (void)interpretHexString(NSString *str)
{
    int r,g,b;
    const char *s = [str cStringUsingEncoding:NSUTF8StringEncoding];

    if (sscanf(s, "#%02x%02x%02x", &r, &g, &b) != 3) {
        /* problem with input */
    } else {
        /* set ivars */
        [self setRed:r];
        [self setGreen:g];
        [self setBlue:b];
    }
}
于 2012-11-12T13:47:14.843 に答える