2011-10-29 11 views
7

मैं अपने आईफोन ऐप को खाल (या डिज़ाइन थीम, या देखो और महसूस, जैसे लकड़ी, धातु, पृथ्वी रंग, पुरुषों, लड़कियों, आदि ... के बीच स्विच करने में सक्षम होना चाहता हूं)।आईओएस ऐप में स्किन्स (या डिज़ाइन थीम) कैसे स्विच करें?

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

इसे लागू करने का सबसे अच्छा अभ्यास क्या है?

शर्तें हैं:

  • मैं इंटरफ़ेस बिल्डर
  • उपयोग करने के लिए मैं iOS 3.1.3 और बाद
  • मैं खाल के सेट इंटरनेट से डाउनलोड किया जा सकता बनाना चाहते समर्थन करने की आवश्यकता करना चाहते हैं (मैं ऐप में सभी खाल को बंडल नहीं कर सकता, क्योंकि त्वचा के एक सेट के लिए बहुत सी छवियों की आवश्यकता होती है और यदि मैं ऐसा करता हूं तो ऐप फ़ाइल का आकार बड़ा हो सकता है ... मैं विशिष्ट खाल के बारे में किसी भी जानकारी को हार्डकोड नहीं करना चाहता ।)
  • यदि एक कस्टम त्वचा में एक या कुछ तत्व नहीं होते हैं, (जैसे एक छवि ओ आर ध्वनि फ़ाइल), मैं चाहता हूं कि यह लापता तत्व का उपयोग त्वचा के डिफ़ॉल्ट सेट से करें।
  • मैं प्रत्येक त्वचा के लिए निब फाइल नहीं बनाना चाहता हूं। एक स्क्रीन के लिए निब फ़ाइल आसान रखरखाव के लिए मुख्य बंडल में एकमात्र होना चाहिए।

मैं अपने ऐप की पूरी UIViewControllers की एक सुपर क्लास बनाने और बात यह है कि यह नोक फाइल लोड ओवरराइड, और मुख्य बंडल से लोड करने के बजाय, त्वचा कि में सहेजा जाता है से संसाधनों के लोड के बारे में सोच रहा हूँ दस्तावेज़ निर्देशिका ... लेकिन मुझे नहीं पता कि यह कैसे करें ... निब-लोडिंग विधियों का डिफ़ॉल्ट व्यवहार हमेशा मुख्य बंडल से संसाधन लोड करता है और संसाधन फ़ाइल नामों के बारे में जानकारी पढ़ने के बाद खो जाती है ...: (

आपकी मदद के लिए अग्रिम धन्यवाद।

+1

यहां आईओएस ऐप को त्वचा के तरीके के बारे में बहुत अच्छी तरह से स्पष्टीकरण दिया गया है: http://stackoverflow.com/questions/8919334/how-to-create-multiple-themes-skins-for-iphone-apps?rq= 1 यह भी बताता है कि कैसे एक नीब, esp त्वचा। आईओएस से 5. –

+1

आप नीचे दी गई लाइब्रेरी पर एक नज़र डाल सकते हैं https://github.com/charithnidarsha/MultiThemeManager –

उत्तर

4

, सबसे अच्छा अभ्यास के बारे में निश्चित नहीं हूँ .. लेकिन अगर अपने app काफी बड़ा नहीं है, तो एक अच्छी तरह से संरचित plist अपने है दोस्त।

प्रारंभ में, आप चुन सकते हैं: धातु थीम। निम्नलिखित को पकड़ना चाहिए:

आपके पास या तो सिंगलटन ThemeManager है, या यदि उचित हो तो अपने सिंगलेट्स में से NSDictionary पर चिपकाएं।

ThemeManager के पीछे बिंदु संपत्ति और विषय के बीच मानचित्रण ..

कुछ नमूना कोड है (SOF पर प्रत्यक्ष रूप से लिखा .. सिंटेक्स गलतियों कोई आपत्ति नहीं है):

#define kThemeMap(__x__) [[ThemeManager sharedManager] assetForCurrentTheme:__x__] 

... 

-(void)doUselessStuff { 
    UIImage* backgroundImage = [UIImage imageNamed:kThemeMap(@"FirstViewBG")]; 

    ... 

} 

//in the ThemeManager: 
//returns the appropriate name of the asset based on current theme 
-(NSString*)assetForCurrentTheme:(NSString*)asset { 
    //_currentTheme is an NSDictionary initialized from a plist. Plist can be downloaded, too. 
    NSString* newAsset = [_currentTheme objectForKey:asset]; 
    if(newAsset == nil) { 
     newAsset = [_defaultTheme objectForKey:asset]; 
    } 
    return asset; 
} 

//Let us assume the user selects Metal Theme somewhere .. Still coding ThemeManager: 
-(void)selectedNewTheme:(NSString*)newTheme { 
    //First, get the full path of the resource .. Either The main bundle, or documents directory or elsewhere.. 
    NSString* fullPath = ...; 
    self.currentTheme = [NSDictionary dictionaryWithContentsOfFile:fullPath]; 
} 

अगर है कि यो के लिए काफी अच्छा है,

//Default.plist 
@"FirstViewBG" : @"FirstViewBG_Default.png" 
@"SecondViewBG" : @"SecondViewBG_Default.png" 
@"WinSound"  : @"WinSound_Default.aiff" 

//Metal.plist 
@"FirstViewBG" : @"FirstViewBG_Metal.png" 
@"SecondViewBG" : @"SecondViewBG_Metal.png" 
@"WinSound"  : @"WinSound_Metal.aiff" 

वैकल्पिक रूप से, तुम सिर्फ पोस्टफ़िक्स बचा सकते हैं: plist फ़ाइलें स्ट्रिंग मानचित्रण करने के लिए तार के साथ सिर्फ एक शब्दकोश रहे हैं ... कुछ इस तरह आप .. लेकिन, एक्सटेंशन को स्लाइस करके स्ट्रिंग मैनिपुलेशन की आवश्यकता होगी -> पोस्टफिक्स जोड़ना -> एक्सटेंशन जोड़ना ..

या शायद इसे उपसर्ग बना सकते हैं?

+0

आपके उत्तर और बहुत वर्णनात्मक कोड के लिए बहुत बहुत धन्यवाद! यह एक संभावित समाधान हो सकता है। :) – Taka

+0

केवल यही कारण है कि मैं इस दृष्टिकोण को लेने में संकोच करता हूं कि इस तरह से मुझे निब फ़ाइल और प्लिस्ट दोनों में संसाधन फ़ाइल नाम के बारे में अनावश्यक जानकारी रखना है। हालांकि इसके लिए बहुत अधिक खर्च नहीं होगा ... मैं अभी भी उम्मीद कर रहा हूं कि निब लोड करने के दौरान संसाधन फ़ाइल नामों को पढ़ने का कोई तरीका है, और प्रक्रिया में फ़ाइल नाम पर विषय-विशिष्ट पोस्टफिक्स या उपसर्ग जोड़ें ... कोई भी विचार? यदि यह आसान नहीं है या संभव नहीं है, तो मैं इस दृष्टिकोण को ले जाऊंगा। धन्यवाद। ;) – Taka

+0

आह .. मैं वास्तव में ऐसा करने के तरीके के बारे में सोच नहीं सकता। आपको उन्हें आईबीओटलेट्स के रूप में लिंक करना होगा और उन्हें दृश्य में अनुकूलित करना होगा;) – Mazyod

0

आप मेथर्ड छवि के साथ यूआईएममेज पर श्रेणी कर सकते हैं नामित :, कस्टम छवि का उपयोग करें नामित: डिफ़ॉल्ट के बजाय। कस्टम मेथॉर्ड में, थीम द्वारा छवि का चयन किया।

+0

आपके उत्तर के लिए धन्यवाद। खैर, यह काम करेगा, लेकिन मेरा मानना ​​है कि एक विधि को ओवरराइड करने के लिए उद्देश्य-सी श्रेणी का उपयोग करना एक अच्छा अभ्यास नहीं है। (जैसा कि http://stackoverflow.com/questions/5272451/overriding-methods-using-categories-in-objective-c में चर्चा की गई है) उस स्थिति में, हम छवि को ओवरराइड करने के लिए UIImage को उपclass कर सकते हैं नामांकित :, लेकिन इस तरह हम इंटरफ़ेस का उपयोग नहीं कर सकते बिल्डर प्रभावी ढंग से। – Taka

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