2011-08-18 15 views
24

बढ़ाया गया जब मैं नेविगेशन बार कस्टम छवि को आरंभ करने के लिए UIBarButtonItem की "initWithImage" का उपयोग करने का प्रयास करता हूं, तो यह धुंधला हुआ और काला नेविगेशन बार के विरुद्ध फैला हुआ है। यह मैं इसे कैसे बनाने है:UIBarButtonItem के लिए सेटिंग छवि - छवि

UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"gear.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(showSetting:)]; 

यहाँ कि यह दिखता है:

enter image description here

किसी भी विचार अगर यह छवि के साथ समस्या है? मुझे इसे खरीदे गए आइकन के सेट से मिला।

उत्तर

12

बार बटन आइटम पर प्रदर्शित छवियां स्रोत छवि से 'व्युत्पन्न' होती हैं (यह केवल प्रतिपादन में अल्फा चैनल मानों का उपयोग करती है लेकिन यह आपकी छवि में ठीक दिखती है)। यह संभवतः सही आकार नहीं है - आपको छवि फ़ाइल खोलने और इसे सही आकार में फसल करने की आवश्यकता हो सकती है।

तुम भी पर देख रहे हैं की कोशिश कर सकते imageInsets संपत्ति (से UIBarButtonItem द्वारा विरासत में मिली UIBarItem) यह फैला रही रोकने के लिए एक तरह से आकार को समायोजित करने के लिए इस्तेमाल किया जा सकता है स्थापित करने या नहीं।

Doco बार आइटम छवियों पर कहते हैं निम्नलिखित:

पट्टी पर प्रदर्शित चित्र इस छवि से हुआ है। यदि यह छवि बार पर फिट होने के लिए बहुत बड़ी है, तो इसे फिट करने के लिए स्केल किया गया है। आमतौर पर, टूलबार और नेविगेशन बार छवि का आकार 20 x 20 अंक होता है।

+1

छवि 40x40 था ... 30x30 करने के लिए फसल बनाता है यह सही आकार की तरह लग रही है, लेकिन यह अभी भी ग्रे है। मुझे लगता है कि मुझे गियर के अंदर सफेद होना चाहिए, ताकि यह पाठ से मेल खा सके? –

+0

हां, इसे सफेद बनाते हुए (आकार बदलने के बाद) काम करता है। –

31

ऐसा करने का सबसे अच्छा तरीका एक बटन बनाना, इसकी पृष्ठभूमि छवि सेट करना और इसकी क्रिया निर्धारित करना है। फिर कस्टम बटन के रूप में इस बटन का उपयोग करके UIBarButtonItem बनाया जा सकता है। यहां मेरा उदाहरण कोड है:

UIButton *settingsView = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 61, 30)]; 
[settingsView addTarget:self action:@selector(SettingsClicked) forControlEvents:UIControlEventTouchUpInside]; 
[settingsView setBackgroundImage:[UIImage imageNamed:@"settings"] forState:UIControlStateNormal]; 
UIBarButtonItem *settingsButton = [[UIBarButtonItem alloc] initWithCustomView:settingsView]; 
[self.navigationItem setRightBarButtonItem:settingsButton]; 
+0

धन्यवाद - यह मेरे लिए एक बहुत अच्छा काम था। मेरे पास एक छवि है जिसे मैं घटाया चाहता था और यह करने का यह एक आसान तरीका था। मैंने ImageWithRenderingMode: UIImageRenderingModeAlwaysTemplate का उपयोग करके मेरी छवि का दूसरा संस्करण बनाया है ताकि यह उचित रूप से रंगा जा सके। – mdebeus

9

मुझे पता है कि इस प्रश्न में पहले से ही एक चेकमार्क वाला उत्तरकर्ता है। लेकिन मैं आज इस में भाग गया और सोचा कि मैं वैसे भी अपना जवाब पेश करूंगा। उपर्युक्त उत्तर में दिए गए चेक ने मेरी मदद की, लेकिन यह पता लगाने के लिए कुछ अतिरिक्त प्रयोग भी किया गया कि वास्तव में क्या हो रहा था।

बटन छवि केवल एक्स अक्ष में संकुचित हो रही है और वाई नहीं। ऐसा इसलिए है क्योंकि यह बटन के लिए बहुत लंबा है और यह फिट करने के लिए इसे कम करता है। लेकिन यह आनुपातिक रूप से इसे कम नहीं करता है। केवल लंबवत पर। तो यह फैला हुआ प्रतीत होता है। यह वास्तव में फैला नहीं है - जो इसका विस्तार करता है। इसके बजाय ऊंचाई कम हो गई है। अंतर को जानना मुझे लगता है कि यह क्यों हो रहा है और इसे ठीक करने का तरीका समझना महत्वपूर्ण है।

enter image description here

मैं एक ही बात ओपी किया था। यह सोचकर कि मैं रेटिना का समर्थन कर रहा हूं, मैंने अपना आइकन 40x40 बनाया है। मेरा अल्फा चैनल के साथ एक हरा चेकमार्क था। यह खाली पिक्सल के साथ 40x40 होने के लिए गद्देदार था। ऐप ने बटन की उपलब्ध ऊंचाई के भीतर फिट करने के लिए इसका आकार बदल दिया। लेकिन चौड़ाई एक ही रही। तो यह 40x30 या 40x20 की सीमा में कहीं और बन गया। मुझे लगता है कि बटन एक आइकन 30 उच्च संभाल सकता है, लेकिन फिर यह IMHO बॉक्स के लिए थोड़ा बड़ा है।

ओपी ने बटन को 30x30 तक घटा दिया और इससे अब और अधिक स्क्विश नहीं हुआ। लेकिन यह सबसे अच्छा समाधान नहीं है। क्योंकि जब आप ऐसा करते हैं तो यह वास्तव में रेटिना बटन नहीं होता है। यह संकुचित है और फिर रेटिना पर वापस उड़ा दिया।

सही उत्तर @ 40x के साथ अपने 40 पिक्सेल लंबा संस्करण का नाम देना है और फिर आधा आकार (20 पिक्सेल लंबा) संस्करण बनाना और @ 2x के बिना इसे सहेजना है।चौड़ाई जो भी हो सकती है। फिर छवि के साथ लोड करें नामित: @ 2x निर्दिष्ट किए बिना। यह रेटिना या गैर-रेटिना डिवाइस के लिए उपयुक्त पीएनजी का उपयोग करेगा।

अगली बात जो मेरे साथ हुई थी तब बटन फ्रेम बहुत छोटा था। तो मैंने बटन को थोड़ा व्यापक और अधिक टापेबल बनाने के लिए पीएनजी में पीएनजी को पैड करने के लिए पीएसडी में अपना कैनवास आकार बढ़ाया।

+0

बहुत उपयोगी उत्तर! आपकी पोस्ट में ग्रीन टिक उचित है =) –

2

stretch

मैं एक ही मेरी 40x40 छवि के लिए बढ़ाया मुद्दा जब मैं leftBarButtonItem

UIBarButtonItem *backButton = [UIBarButtonItem new]; 
[backButton setBackButtonBackgroundImage:[UIImage imageNamed:@"back_icon"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

self.navigationItem.leftBarButtonItem = backButton; 

के लिए पृष्ठभूमि छवि सेट मिल गया लेकिन मेरी मुद्दा निम्नलिखित कोड

के साथ हल मिला

resolved

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_icon"] style:UIBarButtonItemStylePlain target:self action:@selector(handleBack:)]; 

self.navigationItem.leftBarButtonItem = backButton; 

और एक ही परिणाम अगर UIBarButtonItemStyleBordered प्रयोग किया जाता है।

+0

अब तक का सबसे अच्छा जवाब, आसान फिक्स –

0

उन लोगों के लिए जो आईओएस 11 में विशेष रूप से इस टूलबार आइटम को खींच रहे हैं, ऐसा लगता है कि आपकी छवि का @ 2x संस्करण अब इसके फ्रेम और सीमाओं को प्रस्तुत करने के लिए आवश्यक है।

तो अगर आप इस जहाँ आप इस तरह एक कस्टम छवि UIBarButtonItem जोड़ रहे हैं की तरह कोड है:

UIButton *tagsBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
tagsBtn.bounds = CGRectMake(0, 0, 40, 40); 
[tagsBtn setImage:[UIImage imageNamed:@"tags.png"] forState:UIControlStateNormal]; 
tags = [[UIBarButtonItem alloc] initWithCustomView:tagsBtn]; 
[tagsBtn addTarget:self action:@selector(tags:) forControlEvents:UIControlEventTouchUpInside]; 

[bottomToolbar setItems:[NSArray arrayWithObjects:flexibleSpace,tags,flexibleSpace,nil]]; 

तो फिर तुम एक [email protected] कि, 80x80 भी अपने टैग अगर की आवश्यकता होगी। पीएनजी छवि 80x80 है। बस [email protected] पर tag.png का नाम बदलकर छवि को 40x40 में बदल दिया जाएगा क्योंकि यह कोड बदलने के बिना पूर्व आईओएस 11 था, या बस अपनी परियोजना में टैग्स @2x.png जोड़ें।

0

सही छवि का आकार सेट करें: @ 1x = 22px, @ 2x = 44px @ 3x = 88px सबसे पहले।

फिर

let leftBarButtonItem = UIBarButtonItem(image: yourUIImage, style: .plain, target: self, action: #selector(action)) 
leftBarButtonItem.tintColor = UIColor.red 
navigationItem.leftBarButtonItem = leftBarButtonItem 

या

let btn = UIButton(type: .custom) 
btn.addTarget(self, action: #selector(contactMe), for: .touchUpInside) 
btn.setImage(#imageLiteral(resourceName: "open"), for: .normal)