2013-01-24 43 views
6

मैं एक ऐप पर काम कर रहा हूं - या फिर कुछ पुनः उपयोग करने योग्य "ढांचे" पर जो मुझे काम करने के बाद साझा करने में खुशी होगी। इस ऐप के भीतर उपयोगकर्ता रंग विषयों की सूची से चयन करने में सक्षम होना चाहिए। इसलिए ऐप अपने यूआई तत्वों को कुछ गतिशील तरीके से टेंट करने में सक्षम होना चाहिए।प्रोग्रामिंग और गतिशील रूप से UIButton की पृष्ठभूमि छवियों को कैसे टेंट करें?

बटन के लिए सभी टिनटिंग काम नहीं करते हैं। उचित रूप से चित्रित पृष्ठभूमि छवियों को यहां आपूर्ति की जानी चाहिए। लेकिन प्रत्येक के लिए पृष्ठभूमि छवियों का एक सेट तैयार करना सिर्फ दूसरा सबसे अच्छा है। यह गतिशील और लचीला नहीं है।

अंत में चयनित और सामान्य स्थिति के लिए एक मोनोक्रोम (ग्रे) ढाल वाली छवि प्रदान करने के लिए एक समाधान नीचे आ सकता है और उस प्रोग्राम को प्रोग्रामगेटिक रूप से कोरग्राफिक्स या ओपनजीएल का उपयोग करके टिंट कर सकता है। लेकिन स्पष्ट रूप से, मुझे नहीं पता कि वहां कहां से शुरू करना है। ढाल को कैसा दिखना चाहिए और फिर मैं किसी भी रंग में प्रोग्रामेटिक रूप से कैसे टेंट करूं?

बहुत अधिक UISegmentedControls पर लागू होता है, बस थोड़ा और जटिल। :) UISegementedControls को कवर करने वाला कोई सामान्य समाधान भी अत्यधिक सराहना करता है।

+0

[GMButton] पर एक नजर डालें (https://github.com/progrmr/SDK_Utilities/blob/master/GM_Subclasses/GMButton.h) । यह आपको सभी बटन राज्यों के लिए रंग सेट करने की अनुमति देता है और साथ ही बेवल और चमक ग्रेडियेंट भी प्रदान करता है। – progrmr

+0

अच्छा लगता है कि आपने वहां क्या किया। ऐसा लगता है कि मुझे इसे एआरसी में अपनाने की जरूरत है और फिर मुझे वह सब कुछ करना चाहिए जो मैं चाहता हूं। धन्यवाद। –

उत्तर

12

मैं एक पोस्ट है कि मैं नहीं कर सकते लगता है कि इस प्रकार की छवि और यह टिंट लेता है के बाद एक UIImage श्रेणी बनाया:

- (UIImage *)tintedImageWithColor:(UIColor *)tintColor { 
    UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 


    CGContextTranslateCTM(context, 0, self.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height); 

    // draw alpha-mask 
    CGContextSetBlendMode(context, kCGBlendModeNormal); 
    CGContextDrawImage(context, rect, self.CGImage); 

    // draw tint color, preserving alpha values of original image 
    CGContextSetBlendMode(context, kCGBlendModeSourceIn); 
    [tintColor setFill]; 
    CGContextFillRect(context, rect); 

    UIImage *coloredImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return coloredImage; 
} 

यह छवि ले जाएगा और दिए गए रंग के साथ अल्फा मूल्य वाले सभी क्षेत्रों को भर देगा।

+0

एक च्राम की तरह काम करते हैं! –

0

मैं आपको एक ऐसे प्रश्न के बारे में बता रहा हूं जो आपको लगता है कि आप क्या चाहते हैं और इसका जवाब मिल गया है।

How to tint a transparent PNG image in iPhone?

गुड लक!

आपके प्रश्न शीर्षक पर बस एक छोटा सा विवरण ... आपका मतलब है "कैसे" और "हॉट" सही नहीं है?

+1

यह वह जवाब नहीं था जिसे मैं उम्मीद कर रहा था लेकिन ऐसा लगता है कि ऐसा करने योग्य लगता है। धन्यवाद। मैं सप्ताहांत में शायद इसे आज़मा दूंगा। –

1

यहां आपके प्रश्न का आंशिक उत्तर है। यह एक सहायक विधि मैंने लिखा है कि टिंट एक ग्रे पैमाने छवि:

// baseImage is the grey scale image. color is the desired tint color 
+ (UIImage *)tintImage:(UIImage *)baseImage withColor:(UIColor *)color { 
    UIGraphicsBeginImageContextWithOptions(baseImage.size, NO, baseImage.scale); 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGRect area = CGRectMake(0, 0, baseImage.size.width, baseImage.size.height); 

    CGContextScaleCTM(ctx, 1, -1); 
    CGContextTranslateCTM(ctx, 0, -area.size.height); 

    CGContextSaveGState(ctx); 
    CGContextClipToMask(ctx, area, baseImage.CGImage); 

    [color set]; 
    CGContextFillRect(ctx, area); 
    CGContextRestoreGState(ctx); 

    CGContextSetBlendMode(ctx, kCGBlendModeOverlay); 

    CGContextDrawImage(ctx, area, baseImage.CGImage); 

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    // If the original image was stretchable, make the new image stretchable 
    if (baseImage.leftCapWidth || baseImage.topCapHeight) { 
     newImage = [newImage stretchableImageWithLeftCapWidth:baseImage.leftCapWidth topCapHeight:baseImage.topCapHeight]; 
    } 

    return newImage; 
} 
+0

अभी तक धन्यवाद। मैं इसे सप्ताहांत या अगले हफ्ते की शुरुआत में आज़मा दूंगा। यह @OnlyYou लिंक के मूल के समान छोटा दिखता है। हालांकि मैं सीजी ग्राफिक्स जेट से काफी परिचित नहीं हूं, यह काफी आत्म व्याख्या कर रहा है। सिर्फ एक प्रश्न। यह CGContextScalTCM और ContextTranslateTCM समन्वय परिवर्तन के लिए है क्योंकि UIKit और CGGraphics के पास मूल उत्पत्ति और y-axix पर एक अलग अभिविन्यास है? –

41

iOS7 में आप विधि setTintColor:

साथ संयोजन के रूप में विधि imagedWithRenderingMode: उपयोग कर सकते हैं लेकिन, UIImageRenderingModeAlwaysTemplate का उपयोग सुनिश्चित करें के रूप में यह टिंट रंग के साथ एक UIImage पर सभी गैर-पारदर्शी रंग बदल देता है। डिफ़ॉल्ट UIImageRenderingModeAutomatic है।

UIImageRenderingModeAlwaysTemplate

Always draw the image as a template image, ignoring its color information. 

उदाहरण:

[myButton setTintColor:[UIColor colorWithRed:0 green:0.8196f blue:0.0039f alpha:1]]; 

    UIImage * image = [myButton.currentBackgroundImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 

    [myButton setBackgroundImage:image forState:UIControlStateNormal]; 
+1

सावधान रहें - UIImage __weak होने से आईओएस 9 रिलीज मोड में बटन पर कोई छवि नहीं दिखाती है –

+0

SetBamegroudIamge के लिए SetImage के लिए कार्य नहीं –

4

मैं एक UIButton श्रेणी बनाई horsejockey के कोड का उपयोग: https://github.com/filipstefansson/UITintedButton

यहाँ नए तरीकों:

0,123,
-(void)setImageTintColor:(UIColor *)color; 
-(void)setBackgroundTintColor:(UIColor *)color forState:(UIControlState)state; 
+(void)tintButtonImages:(NSArray *)buttons withColor:(UIColor *)color; 
+(void)tintButtonBackgrounds:(NSArray *)buttons withColor:(UIColor *)color forState:(UIControlState)state; 
0

मैं "horsejockey" से कुछ चीजें modifie:

+(UIImage *)getTintedImage:(UIImage*)image withColor:(UIColor *)tintColor 
{ 
    UIGraphicsBeginImageContextWithOptions(image.size, NO, [[UIScreen mainScreen] scale]); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 


    CGContextTranslateCTM(context, 0, image.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height); 

    // draw alpha-mask 
    CGContextSetBlendMode(context, kCGBlendModeNormal); 
    CGContextDrawImage(context, rect, image.CGImage); 

    // draw tint color, preserving alpha values of original image 
    CGContextSetBlendMode(context, kCGBlendModeSourceIn); 
    [tintColor setFill]; 
    CGContextFillRect(context, rect); 

    UIImage *coloredImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return coloredImage; 
}