RGBの色を設定するためのUIColorよりマクロ良いですか?
-
12-09-2019 - |
質問
私は自分のヘッダファイルにこのマクロを持っています:
#define UIColorFromRGB(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]
そして、私は私の.mファイル内でこのようなものとしてこれを使用しています:
cell.textColor = UIColorFromRGB(0x663333);
だから私は誰もがこの良いですか、私はこのアプローチを使用する必要があります聞いてみたい。
cell.textColor = [UIColor colorWithRed:66/255.0
green:33/255.0
blue:33/255.0
alpha:1.0];
どちらがより良い方法です?
解決
真ん中の地面には、あなたの最良の選択肢かもしれません。あなたは、マクロが今やっているやって定期的にCまたはObjective-Cの機能のいずれかを定義することができます:
// As a C function:
UIColor* UIColorFromRGB(NSInteger rgbValue) {
return [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0
green:((float)((rgbValue & 0xFF00) >> 8))/255.0
blue:((float)(rgbValue & 0xFF))/255.0
alpha:1.0];
}
// As an Objective-C function:
- (UIColor *)UIColorFromRGB:(NSInteger)rgbValue {
return [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0
green:((float)((rgbValue & 0xFF00) >> 8))/255.0
blue:((float)(rgbValue & 0xFF))/255.0
alpha:1.0];
}
マクロに固執することを決定した場合、それが表示された場所に、しかし、あなたはrgbValue
の前後に括弧を挿入する必要があります。私はあなたのマクロを呼び出すことにした場合:
UIColorFromRGB(0xFF0000 + 0x00CC00 + 0x000099);
あなたがトラブルに実行することがあります。
のコードの最後のビットは確かに最も読みやすい、おそらく最も移植性がある - あなたはどこでもあなたのプログラムの中から、単にそれを呼び出すことはできません。
。すべてのすべてで、私は関数にマクロをリファクタリングし、その時にそれを残すことをお勧めしたい。
他のヒント
や、別のカテゴリを作成します:
@interface UIColor (util)
+ (UIColor *) colorWithHexString:(NSString *)hex;
+ (UIColor *) colorWithHexValue: (NSInteger) hex;
@end
と
#import "UIColor-util.h"
@implementation UIColor (util)
// Create a color using a string with a webcolor
// ex. [UIColor colorWithHexString:@"#03047F"]
+ (UIColor *) colorWithHexString:(NSString *)hexstr {
NSScanner *scanner;
unsigned int rgbval;
scanner = [NSScanner scannerWithString: hexstr];
[scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"#"]];
[scanner scanHexInt: &rgbval];
return [UIColor colorWithHexValue: rgbval];
}
// Create a color using a hex RGB value
// ex. [UIColor colorWithHexValue: 0x03047F]
+ (UIColor *) colorWithHexValue: (NSInteger) rgbValue {
return [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0
green:((float)((rgbValue & 0xFF00) >> 8))/255.0
blue:((float)(rgbValue & 0xFF))/255.0
alpha:1.0];
}
@end
どのようにあなた自身の作成について:
#define RGB(r, g, b) \
[UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]
#define RGBA(r, g, b, a) \
[UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:(a)]
そして、それを使用します:
cell.textColor = RGB(0x66, 0x33, 0x33);
色および追加の計算オーバヘッドを必要とせず進値を使用し、使用するのに十分に簡単に思える。
私は、一般的な機能ではなく、複雑なの#defineをお勧めします。インライン化は、本当の利点を持っている場合、コンパイラは、一般的にあなたのためにそれを行います。 #defineは、彼らが(そしてこの1つはある)複雑だ場合は特に、困難なデバッグを行います。
しかし、ここでの機能を使うことには何も問題はありません。私が言うと思いだけnitpickは、あなたがfloatではなくCGFloatを使用しなければならないことですが、それはあなたのためのより快適だ場合は16進表記では何も問題はありません。あなたはこれらの多くを持っている場合は便利かもしれウェブカラー表記を使用している、私は見ることができます。しかし、マクロを避けます。
UIcolor方法I.m.h.oは、より読みやすいです。私は、彼らが問題を解決した場合、マクロのは素晴らしいと思います。すなわち、より多くの性能および/または読み取り可能なコードを提供します。
マクロを使用する利点は、この場合には何か私には明確ではないので、私は2番目のオプションを好むだろう。
33!= 0x33のことを覚えておいてください。最初の10進数であり、第二は、16進数です。彼らは両方とも有効ですが、彼らは異なっています。あなたの2番目のオプションは、読んでください。
cell.textColor = [UIColor colorWithRed:0x66/255.0
green:0x33/255.0
blue:0x33/255.0
alpha:1.0];
または
cell.textColor = [UIColor colorWithRed:102/255.0
green:51/255.0
blue:51/255.0
alpha:1.0];
ニースマリウスは、私は次のように(そうでない場合は、Objective Cのは、文字通り、それを取り、あなたは、構文コンパイルエラーを取得し、括弧を取り除くために持っていたコンパイルします:
#define RGB(r,g,b) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0]
...
NSArray *palette;
...
palette = [NSArray arrayWithObjects:
RGB(0,0,0),
RGB(255,0,0), // red
...