كيف يمكنني تحديد القيم الثابتة لـ uicolor؟
-
01-10-2019 - |
سؤال
أريد أن أفعل شيئًا كهذا ، لكن لا يمكنني الحصول على بناء جملة تعاونية.
static const UIColor *colorNavbar = [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0];
أفترض أنه يمكنني تحديد وحدات الماكرو ، لكنها قبيحة.
المحلول
أحب استخدام الفئات لتوسيع الفصول مع طرق جديدة لهذا النوع من الأشياء. إليك مقتطف من الكود الذي كتبته للتو اليوم:
@implementation UIColor (Extensions)
+ (UIColor *)colorWithHueDegrees:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness {
return [UIColor colorWithHue:(hue/360) saturation:saturation brightness:brightness alpha:1.0];
}
+ (UIColor *)aquaColor {
return [UIColor colorWithHueDegrees:210 saturation:1.0 brightness:1.0];
}
+ (UIColor *)paleYellowColor {
return [UIColor colorWithHueDegrees:60 saturation:0.2 brightness:1.0];
}
@end
الآن في الكود يمكنني أن أفعل أشياء مثل:
self.view.backgroundColor = highlight? [UIColor paleYellowColor] : [UIColor whitecolor];
وتناسب الألوان المحددة الخاصة بي إلى جانب تلك المحددة من قبل النظام.
(بالمناسبة ، بدأت أفكر أكثر من حيث HSB أكثر من RGB لأنني أولي اهتمامًا أكبر للألوان.)
تحديث بخصوص حساب القيمة: حدسي هو أنه لا يستحق ذلك. ولكن إذا أردت حقًا ، فيمكنك وضع مذكرات القيم ذات المتغيرات الثابتة:
+ (UIColor *)paleYellowColor {
static UIColor *color = nil;
if (!color) color = [UIColor colorWithHueDegrees:60 saturation:0.2 brightness:1.0];
return color;
}
هل يمكن أن تجعل الماكرو يفعل المذكرة أيضًا.
نصائح أخرى
عادةً ما أقوم بعمل فئة من uicolor لكل مشروع:
@interface UIColor (ProjectName)
+(UIColor *) colorForSomeTable;
+(UIColor *) colorForSomeControl;
+(UIColor *) colorForSomeText;
@end
مع الثوابت في التنفيذ:
@implementation UIColor (ProjectName)
+(UIColor *) colorForSomeTable { return [UIColor colorWithRed:...]; }
@end
أفعل نفس الشيء بالنسبة لـ UIFONT و UIIMAGE حسب الحاجة.
للتوسع في إجابة Jasoncrawford (سأضع هذا كتعليق ، لكن لا يمكنك تنسيق الكود في التعليقات) إذا كنت ترغب في الحصول على القيم المسبقة (أو القيام بذلك مرة واحدة فقط).
+ (UIColor *)paleYellowColor
{
static UIColor* paleYellow = nil;
if (paleYellow == nil)
{
paleYellow = [UIColor colorWithHueDegrees:60 saturation:0.2 brightness:1.0];
}
return paleYellow;
}
السبب في أن فكرتك الأصلية لا تنجح هو أن المترجم لا يمكنه استخدام الأوليات فقط خارج الوظائف ، وليس التعليمات البرمجية العادية. كان بإمكانك تحقيق شيء مثل ما تريده مع تهيئة methoSD على سبيل المثال
static UIColor* colorNavBar = nil;
+(void) initialize
{
if (colorNavBar != nil)
{
colorNavBar = ....
}
}
nb const
التصفيات على التعريف الأصلي الخاص بك زائدة عن الحاجة منذ ذلك الحين UIColor
غير قابل للتغيير على أي حال.
يمكنك "تحديد" ثابت مماثل مثل هذا:
#define FAV_COLOR [UIColor colorWithRed:24/255.0f green:89/255.0f blue:36/255.0f alpha:0.9]
واتصل بها بالاسم كما كنت معتادًا على الثوابت: FAV_COLOR
امل ان يساعد.
يمكنك القيام بالأمر:
#define backgroundColorApp [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0]
في سويفت: تحديد التمديد
extension UIColor {
class func XXXWhiteColor() -> UIColor {
return UIColor(red: 256, green: 256, blue: 256, alpha: 1.0)
}
class func XXXGreenColor() -> UIColor {
return UIColor(red: 73/255.0, green: 212/255.0, blue: 86/255.0, alpha: 1.0)
}
}
استخدم مثل: label.background = uicolor.xxxxwhitecolor ()
#define textColorApp [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0]
myLabel.textColor=textColorApp;
فقط حدد الماكرو أدناه في ملفك الثابت وتمرير قيمة RGB فقط واستخدمه في أي مكان تريده
#define RGBCOLOR(r,g,b)[UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]
ليستخدم :
[lblCount setTextColor:RGBCOLOR(236, 43, 92)];
أشعر أنه من الجدير بالذكر أيضًا ميزة رائعة أخرى نادراً ما يتم الحديث عنها: Color Distalals. ليس فقط هم أسهل في القراءة ، ولكن من الأسهل تحريرها. في سويفت ،
let color: UIColor = #colorLiteral(red: 0.9607843137, green: 0.4784313725, blue: 0.3215686275, alpha:
عند لصقها في Xcode ، يقوم هذا الجملة بإنشاء صندوق ألوان بسيط.انقر هنا لمشاهدة مثال.
بمجرد رؤية المربع ، يمكنك بعد ذلك النقر فوقه على تعديله بسهولة. وبالمثل ، يمكنك التبديل بين خيارات IB المختلفة ، بما في ذلك Sliders RGB, ، إذا كان لديك قائمة محددة من قيم سداسي اللون من المصمم الخاص بك.