2012-04-25 26 views
13

मैं आईओएस 5.0+ मंच को लक्षित करने वाला अपना पहला आईओएस ऐप लिख रहा हूं। मैं अनुप्रयोग UI को अनुकूलित करने के लिए UIAppearance प्रोटोकॉल का उपयोग कर रहा हूं।UIImage resizableImageWithCapInsets: अपेक्षित काम नहीं कर रहा

मैं पूरे एप्लिकेशन में UIBarButtonItem के लिए पृष्ठभूमि बदलने की कोशिश कर रहा हूं। इस तथ्य के कारण कि मेरे UIBarButtonItem का उपयोग टेक्स्ट या आइकन के आधार पर आकार बदल सकता है, मैं अपनी पृष्ठभूमि पीएनजी के साथ UIImage resizableImageWithCapInsets: का उपयोग करने की कोशिश कर रहा हूं।

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

यहां कोड है जिसका मैं उपयोग कर रहा हूं।

DreamsAppDelegate.m - customizeAppearance:

UIImage *btnBg = [[UIImage imageNamed:@"navBarButton-bg"] 
      resizableImageWithCapInsets:UIEdgeInsetsMake(0, 6, 0, 6)]; 

[[UIBarButtonItem appearance] setBackgroundImage:btnBg 
             forState:UIControlStateNormal 
             barMetrics:UIBarMetricsDefault]; 

यहाँ यहाँ png पृष्ठभूमि छवि मैं

png background

उपयोग करने के लिए कोशिश कर रहा हूँ है और (सिम्युलेटर में) परिणाम है

result of trying to use resizableImageWithCapInsets:

उत्तर

19

left और right के बीच आपकी छवि का अनुभाग, और top और bottom के बीच, छवि द्वारा आवश्यक स्थान को भरने के लिए टाइल किया गया है। UIEdgeInsetsMake(15, 6, 15, 6) आज़माएं।

सामान्य करने के लिए, यदि आपकी छवि में निरंतर ढाल है, तो दोहराया गया अनुभाग केवल 1 पिक्सेल ऊंचा होना चाहिए। चूंकि आपकी बटन छवि 31 पिक्सेल ऊंची है, top और bottom (UIEdgeInsetsMake पर पहला और तीसरा तर्क) 30 में जोड़ना चाहिए। उन्हें बराबर नहीं होना चाहिए; UIEdgeInsetsMake(8, 6, 22, 6) बार-बार खंड को स्थानांतरित करेगा, जिसके परिणामस्वरूप एक पैलर पृष्ठभूमि होगी।

साथ ही, क्या आप छवि के सादे या रेटिना ('@ 2x') संस्करण को संलग्न करते हैं? इंससेट सादे संस्करण के आकार के भीतर होना चाहिए।

+0

धन्यवाद:

तो, यह कोड का उपयोग करें। पोस्ट की गई छवि @ 2x है। तो मुझे माप मापना चाहिए (0, 3, 0, 3)? आप कह रहे हैं कि मुझे अपनी छवि 1px चौड़ी के बीच बनाना चाहिए? मैं समझता हूं कि ऐसा क्यों होगा, लेकिन मेरे द्वारा अनुसरण किए जाने वाले ट्यूटोरियल में एक छवि थी जो 30 पीएक्स द्वारा 40 पीएक्स थी, उसी शैली के ढाल के साथ खुद के रूप में और यह शानदार काम करता है (UIEdgeInsetsMake के साथ जो मैं अब उपयोग कर रहा हूं, बस एक पिक्सेल द्वारा समायोजित किया गया है मेरे कोने त्रिज्या के कारण)। –

+0

यहां चाल है: आप ऊपर और नीचे _if_ के लिए 0 का उपयोग कर सकते हैं आपकी पृष्ठभूमि छवि नेविगेशन बार बटन के समान ऊंचाई है।यह सिर्फ आपके मौजूदा ढाल के साथ उस जगह को भरता है। आपकी छवि रेटिना नेविगेशन बटन की ऊंचाई _not_ नहीं है, इसलिए इसे उस ऊंचाई को भरने के लिए या तो बढ़ाया या दोहराया जाएगा। आपको एक शीर्ष और निचला टोपी आकार (पहला और तीसरा तर्क) प्रदान करना होगा। '(7, 3, 7, 3) 'से शुरू करें। यह कुछ स्ट्रिपिंग छोड़ देगा, लेकिन आशा है कि क्या हो रहा है इसके बारे में एक स्पष्ट विचार दें। – Dondragmer

+0

अहह जो थोड़ा और समझ में आता है। रेटिना नवबार बटन का आकार क्या है? मैं अपने यूआई तत्वों को रेटिना आकार की PSD फ़ाइल से बंद कर रहा हूं, इसलिए यदि मुझे पीएसडी फ़ाइल पर नेविबार बटन बीजी बड़ा करना है और मुझे जो चाहिए उसे प्राप्त करने के लिए इसे निर्यात करना है, जिससे यह मेरे लिए आसान हो जाएगा। –

17

मुझे एक ही समस्या है।

एक और चीज जो आप कर सकते हैं वह है UIImageResizingModeStretch का आकार बदलने वाला मोड। यह मेरी समस्या हल हो गया।

होपवेवर, यह आईओएस 5 में उपलब्ध नहीं है। तो मेरा समाधान ऐसा करना होगा जैसा कि हर किसी ने कहा था। महसूस करें कि टाइल करने योग्य पक्ष सिर्फ एक पिक्सेल होना चाहिए। वैसे भी अधिकांश बटन बीच में ज्यादा नहीं बदलते हैं। आपकी प्रतिक्रिया के लिए

-(UIImage *) resizableImageWithCapInsets2: (UIEdgeInsets) inset 
    { 
     if ([self respondsToSelector:@selector(resizableImageWithCapInsets:resizingMode:)]) 
     { 
      return [self resizableImageWithCapInsets:inset resizingMode:UIImageResizingModeStretch]; 
     } 
     else 
     { 
      float left = (self.size.width-2)/2;//The middle points rarely vary anyway 
      float top = (self.size.height-2)/2; 
      return [self stretchableImageWithLeftCapWidth:left topCapHeight:top]; 
     } 
    } 
+3

पर सेट है, इसका उत्तर देने के लिए समय निकालने के लिए धन्यवाद, भले ही यह पुरानी पोस्ट हो। बहुत सराहना की! –

+1

अन्य उत्तरों वास्तव में समस्या को हल नहीं कर रहे हैं। धन्यवाद। –

+1

धन्यवाद! मेरे लिए बहुत अच्छा काम किया। –

संबंधित मुद्दे