2012-02-23 24 views
16

में वर्तमान एप्लिकेशन आइकन कैसे प्राप्त करें कोई कोको-टच ऐप में वर्तमान एप्लिकेशन आइकन प्राप्त करने का कोई तरीका है? धन्यवाद।आईओएस

उत्तर

13

मैं मेरा जवाब पूरी तरह से moosgummi's पर आधारित है, लेकिन इसके बजाय UIImage लौटा रहा है।

UIImage *appIcon = [UIImage imageNamed: [[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIconFiles"] objectAtIndex:0]]; 

UIImage स्वचालित रूप से उपयुक्त संस्करण का चयन करता है (सामान्य, @2x, ~ipad, [email protected] या भविष्य के किसी भी प्रत्यय)। (बीटीडब्ल्यू, क्या आप छवियों के संस्करणों की पहचान करने के लिए इस बेवकूफ योजना से नफरत करते हैं? यह सिर्फ हाथ से बाहर हो रहा था। संपत्ति कैटलॉग के लिए भगवान का शुक्र है!)

+1

मैं पुष्टि कर सकता है कि UIImage imageNamed उचित @ 2x फ़ाइल कहा जाता है एक नोट के रूप में:।। पैमाने कारक को संशोधित करता है छवि का आकार –

+0

असल में यह योजना बहुत सारे काम को बचाती है। केवल एक चीज जो मुझे पसंद नहीं है वह विभिन्न उपकरणों के लिए कई छवियों के साथ एप्लिकेशन का आकार है। पता नहीं है कि ऐप स्टोर पर्याप्त स्मार्ट हो सकता है या नहीं आदि जब रेटिना समर्थित है सिर्फ @ 2x छवियों देने, –

+6

यह .xcassets – Siegfoult

8

यही आसान है, क्योंकि वर्तमान आइकन के फ़ाइल नाम Info.plist में स्थापित किया जाएगा:

NSString *filePath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIconFiles"] objectAtIndex:0]]; 

आप का उपयोग करना चाहिए आप उच्च रिज़ॉल्यूशन संस्करण लेने के लिए चाहते हैं:

NSString *filePath = nil;  
for (NSString *fileName in [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIconFiles"]) { 
    if ([fileName rangeOfString:@"@2x"].location != NSNotFound) { 
     filePath = [[NSString alloc] initWithString:fileName]; 
    } 
} 
+0

लगता है कि कोड अच्छी तरह से काम नहीं करता है। मैं प्रतीक नहीं मिल सका, मैं नहीं जानता कि क्यों :( – zsounder

+0

कोशिश 'NSLog ([NSBundle mainBundle] infoDictionary]);।' पता लगाने के लिए अगर वहाँ एक 'CFBundleIconFiles' वस्तु यदि नहीं, तो वहाँ कुछ गलत तुम्हारे साथ है अनुप्रयोग। । विन्यास – dom

+0

कॉल objectForKey आईडी, कुछ समय आईडी के प्रकार वास्तव में NSString है, लेकिन नहीं NSArray, शायद इस समस्या है रिटर्न – zsounder

9

इस प्रकार आइकन को info.plist के अंदर सेट किया गया है,

//try doing NSLog(@"%@",[[NSBundle mainBundle] infoDictionary]); 

CFBundleIcons =  { 
     CFBundlePrimaryIcon =   { 
      CFBundleIconFiles =    (
       "icon.png",//App icon added by you 
       "[email protected]"//App icon in retina added by you 
      ); 
      UIPrerenderedIcon = 1; 
     }; 
    }; 

आप नीचे दिए गए कोड एप्लिकेशन आइकन उपयोग प्राप्त करना चाहते हैं:

UIImage *appIcon = [UIImage imageNamed: [[[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIcons"] objectForKey:@"CFBundlePrimaryIcon"] objectForKey:@"CFBundleIconFiles"] objectAtIndex:0]]; 

पुनश्च: UIImage स्वचालित रूप से रेटिना प्रदर्शन के लिए उपयुक्त आइकन चुनता है।

मुझे उम्मीद है कि यह मदद करता है !!

16

स्वीकृत उत्तर मेरे लिए काम नहीं करता है, मैं ऐप आइकन संग्रहीत करने के एक्सकोड 5 की छवियों का उपयोग कर रहा हूं। यह संशोधन मेरे लिए काम किया:

UIImage *appIcon = [UIImage imageNamed: [[[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIcons"] objectForKey:@"CFBundlePrimaryIcon"] objectForKey:@"CFBundleIconFiles"] objectAtIndex:0]]; 

संदेह में, केवल lldb का उपयोग करके मुख्य बंडल की infoDictionary का पता लगाएं।

+1

थोड़ा छोटा: 'UIImage * appIcon = [UIImage imageNamed: [[NSBundle mainBundle] .infoDictionary [@" CFBundleIcon "] [@" CFBundlePrimaryIcon "] [@" CFBundleIconFiles "] firstObject]]; ' – pkamb

8

आप संपत्ति कैटलॉग का उपयोग करते हैं, तो आप बस का उपयोग कर सकते हैं:

UIImage* appIcon = [UIImage imageNamed:@"AppIcon60x60"];

एसेट कैटलॉग एप्लिकेशन आइकन के लिए फ़ाइल नाम मानकीकृत करने के लिए लग रहे हैं।

निश्चित रूप से यदि आपको अपने बंडल में सभी ऐप आइकन सूचीबद्ध करने की आवश्यकता है तो आप इसे CFBundleIconFiles जानकारी शब्दकोश की शाखा में देख सकते हैं।

KVC का उपयोग करते हुए आप आसानी से प्राप्त कर सकते हैं कोड की एक पंक्ति में:

NSArray* allIcons = [[[NSBundle mainBundle] infoDictionary] valueForKeyPath:@"CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles"]; 

परिणामस्वरूप सरणी अपने बंडल में उपलब्ध सभी एप्लिकेशन आइकन नाम शामिल होंगे। इन नामों में से किसी भी +[UIImage imageNamed:]

<__NSCFArray 0x15d54260>(
    AppIcon29x29, 
    AppIcon40x40, 
    AppIcon60x60 
) 
6

का उपयोग कर आइकन को पुनः प्राप्त करने के लिए इस्तेमाल किया जा सकता है क्योंकि यह मुझे एक छोटे से समय लिया बाहर काम करने के लिए, यहाँ एक काम स्विफ्ट समाधान है।

let primaryIconsDictionary = NSBundle.mainBundle().infoDictionary?["CFBundleIcons"]?["CFBundlePrimaryIcon"] as? NSDictionary 
    let iconFiles = primaryIconsDictionary!["CFBundleIconFiles"] as NSArray 
    let lastIcon = iconFiles.lastObject as NSString //last seems to be largest, use first for smallest 
    let theIcon = UIImage(named: lastIcon) 

    let iconImageView = UIImageView(image: theIcon) 
4

यहाँ एक स्विफ्ट 3.x आवेदन आइकन प्राप्त करने के लिए UIApplication को विस्तार है।आप चुन सकते हैं कि iconFiles सरणी से खींचने वाले आइकन पथ के स्थान के आधार पर सबसे छोटा या सबसे बड़ा आइकन प्राप्त करना है या नहीं।

extension UIApplication { 
    var icon: UIImage? { 
     guard let iconsDictionary = Bundle.main.infoDictionary?["CFBundleIcons"] as? NSDictionary, 
      let primaryIconsDictionary = iconsDictionary["CFBundlePrimaryIcon"] as? NSDictionary, 
      let iconFiles = primaryIconsDictionary["CFBundleIconFiles"] as? NSArray, 
      // First will be smallest for the device class, last will be the largest for device class 
      let lastIcon = iconFiles.lastObject as? String, 
      let icon = UIImage(named: lastIcon) else { 
       return nil 
     } 

     return icon 
    } 
} 

आइकन पहुंचने के लिए, फोन निम्नलिखित:

let icon = UIApplication.shared.icon 

बोनस अंक के लिए, आप भी दो वार्स कि आपके ऐप में यह आवश्यक छोटी और सबसे बड़ा आइकन प्राप्त करने के लिए कर सकता है।

+1

स्विफ्ट 3 कोड की पहली पंक्ति" प्रकार 'कोई भी' कोई सबस्क्रिप्ट सदस्य हैं " – Crazor

+0

@Crazor धन्यवाद, देता है कि कोड शुरू में काम किया जब मैं एक बीटा बिल्ड में परीक्षण किया है, लेकिन मैं त्रुटि आप सूचना दी और काम करने के लिए कोड अद्यतन देखा। – CodeBender

2

आप Xamarin उपयोग कर रहे हैं:

var iconNames = NSBundle.MainBundle.InfoDictionary.ValueForKeyPath((NSString)"CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles") as NSArray; 
var name = iconNames.GetItem<NSString>(iconNames.Count - 1); //Grabs last item, call with 0 for the first item 
var icon = UIImage.FromBundle(name); 

पर Andy's answer KVC विधि का उपयोग कर के आधार पर। बिट लंबा, लेकिन KeyPath का उपयोग ValueForKey को कॉल करने से बेहतर है।