2012-06-18 20 views
6

पर कोई छाया/एम्बॉस मुझे कस्टम UIBarButtonItem के साथ कोई समस्या नहीं है। जब मैं के माध्यम सेUIBarButtonItem

[[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"FilterIcon.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(filterTouched:)]; 

एक कस्टम UIBarButtonItem बनाने जिसके परिणामस्वरूप बटन नहीं है "उभरा" देखो, यह है कि प्रणाली आइटम उनके आइकन के पीछे एक अर्द्ध पारदर्शी काला छाया रखकर हासिल करते हैं।

Left: system item, right: custom item

छोड़ दिया पर आप "व्यवस्थित करें" प्रणाली बार बटन आइटम, ऊपर से कोड की rightthe परिणाम देखें।

संसाधन में छाया बनाना, व्यर्थ है क्योंकि आईओएस/कोको केवल छवि का मुखौटा इस्तेमाल किया और किसी भी रंग जानकारी को छोड़ देता है।

दिलचस्प बात यह है कि अगर मैं इंटरफ़ेस-बिल्डर में बार बटन आइटम बनाता हूं तो यह ठीक दिखता है। हालांकि, मेरी समस्या के संदर्भ में, मुझे कोड में बटन आइटम बनाना होगा।

उत्तर

10

जेम्स फ्यूरी की लिपि का उद्देश्य-सी संस्करण है।

- (UIImage *)applyToolbarButtonStyling:(UIImage *)oldImage { 
    float shadowOffset = 1; 
    float shadowOpacity = .54; 
    CGRect imageRect = CGRectMake(0, 0, oldImage.size.width, oldImage.size.height); 
    CGRect shadowRect = CGRectMake(0, shadowOffset, oldImage.size.width, oldImage.size.height); 
    CGRect newRect = CGRectUnion(imageRect, shadowRect); 
    UIGraphicsBeginImageContextWithOptions(newRect.size, NO, oldImage.scale); 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextScaleCTM(ctx, 1, -1); 
    CGContextTranslateCTM(ctx, 0, -(newRect.size.height)); 
    CGContextSaveGState(ctx); 
    CGContextClipToMask(ctx, shadowRect, oldImage.CGImage); 
    CGContextSetFillColorWithColor(ctx, [UIColor colorWithWhite:0 alpha:shadowOpacity].CGColor); 
    CGContextFillRect(ctx, shadowRect); 
    CGContextRestoreGState(ctx); 
    CGContextClipToMask(ctx, imageRect, oldImage.CGImage); 
    CGContextSetFillColorWithColor(ctx, [UIColor colorWithWhite:1 alpha:1].CGColor); 
    CGContextFillRect(ctx, imageRect); 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 
7

मुझे लगता है कि कारण यह तब होता है एक और सवाल करने के लिए इन उत्तरों से आच्छादित है:

https://stackoverflow.com/a/3476424/1210490

https://stackoverflow.com/a/6528603/1210490

UIBarButtonItems अलग ढंग से जहां आप प्रोग्राम उन्हें संलग्न के आधार पर व्यवहार करते हैं। यदि आप उन्हें टूलबार से जोड़ते हैं, तो वे सफेद "उभरा" आइकन बन जाएंगे। यदि आप उन्हें नेविगेशन बार से जोड़ते हैं, तो वे नहीं करेंगे।

मैं पिछले कुछ घंटों बिताया है UIImages के लिए उपकरण पट्टी UIBarButtonItem स्टाइल लागू करने के लिए एक समारोह लेखन। यह MonoTouch के लिए सी # में लिखा गया है, लेकिन मुझे यकीन है कि आप Obj सी कोई problemo को यह बदलाव करने में सक्षम हो जाएगा हूँ ...

UIImage ApplyToolbarButtonStyling(UIImage oldImage) 
{ 
    float shadowOffset = 1f; 
    float shadowOpacity = .54f; 
    RectangleF imageRect = new RectangleF(PointF.Empty, oldImage.Size); 
    RectangleF shadowRect = new RectangleF(new PointF(0, shadowOffset), oldImage.Size); 
    RectangleF newRect = RectangleF.Union(imageRect, shadowRect); 
    UIGraphics.BeginImageContextWithOptions(newRect.Size, false, oldImage.CurrentScale); 
    CGContext ctxt = UIGraphics.GetCurrentContext(); 
    ctxt.ScaleCTM(1f, -1f); 
    ctxt.TranslateCTM(0, -newRect.Size.Height); 
    ctxt.SaveState(); 
    ctxt.ClipToMask(shadowRect, oldImage.CGImage); 
    ctxt.SetFillColor(UIColor.FromWhiteAlpha(0f, shadowOpacity).CGColor); 
    ctxt.FillRect(shadowRect); 
    ctxt.RestoreState(); 
    ctxt.ClipToMask(imageRect, oldImage.CGImage); 
    ctxt.SetFillColor(UIColor.FromWhiteAlpha(1f, 1f).CGColor); 
    ctxt.FillRect(imageRect); 
    UIImage newImage = UIGraphics.GetImageFromCurrentImageContext(); 
    UIGraphics.EndImageContext(); 
    return newImage; 
} 

तो, एक UIBarButtonItem है कि इस तरह देखने के लिए प्रयोग किया है:

Before

समारोह के साथ बजाय ऊपर बनाया गया, इस तरह:

UIBarButtonItem barButtonItem = new UIBarButtonItem(ApplyToolbarButtonStyling(UIImage.FromFile("MusicIcon.png")), UIBarButtonItemStyle.Plain, delegate {}); 

अब इस प्रकार दिखाई देगा:

After

आशा यह भविष्य में किसी को मदद मिलती है।

+0

पढ़ने के लिए धन्यवाद।असल में, यह मुझे लगता है जैसे ऐप्पल में असंगतता मुद्दा है। मैंने कुछ डिफ़ॉल्ट ऐप्स की जांच की है, और नेविगेशन बार्स में कुछ आइकन उभरा हुआ दिखता है (उदा। संपर्कों में प्लस आइकन या संदेशों में लिखने का बटन)। – Chris

+0

मेरा भगवान, इस विस्तृत प्रयास के लिए बहुत बहुत धन्यवाद। अफसोस की बात है, मेरे पास उत्पाद के हमारे वर्तमान संस्करण में इसे शामिल करने का समय नहीं है, लेकिन अगली रिलीज के लिए प्रयास करेगा। एक बार फिर धन्यवाद। – Chris

0

जेम्स फ्यूरी की लिपि में छाया ऑफसेट का ध्यान रखें।

float shadowOffset = 1.0f // for a UIBarButtonItem in UINavigationItem 
float shadowOffset = 0.0f // for a UIBarButtonItem in UIToolBar 

यह आईओएस 6.1 SDK के साथ मनाया गया: मैं निम्नलिखित अनुभव कर लिया है।

(अब आईओएस 7 के तहत अप्रचलित)