2012-02-23 10 views

risposta

13

I ha basato la mia risposta completamente su moosgummi's, ma restituendo un UIImage invece.

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

Il UIImage seleziona automaticamente la versione adatta (normale, @2x, ~ipad, [email protected] o qualsiasi suffisso futuro). (BTW, non ti basta odiare questo stupido schema per identificare versioni di immagini? Stava sfuggendo di mano. Grazie a Dio per Asset Catalogs!)

+1

Posso confermare che l'UIImage imageNamed ha chiamato il file @ 2x appropriato. Come nota: il fattore di scala modifica il dimensione dell'immagine –

+0

In realtà lo schema fa risparmiare un sacco di lavoro.L'unica cosa che non mi piace è la dimensione dell'applicazione con più immagini per diversi dispositivi.Non so se l'App Store potrebbe essere abbastanza intelligente per consegnare solo le immagini @ 2x quando la retina è supportata, ecc. –

+6

Questo non funziona in Xcode 5 se si utilizza .xcassets – Siegfoult

8

Quello è facile, perché il nome del file dell'icona corrente viene impostato in Info.plist:

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

Se si vuole scegliere la versione in alta risoluzione si dovrebbe usare:

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

Sembra che il codice non funzioni bene. Non ho potuto ottenere icone, non so perché :(. – zsounder

+0

Prova 'NSLog ([NSBundle mainBundle] infoDictionary]);' per scoprire se esiste un oggetto 'CFBundleIconFiles'. In caso contrario, c'è qualcosa di sbagliato nell'app – dom

+0

L'oggetto callForKey restituisce l'id, a volte il tipo di id è realmente NSString ma non NSArray, forse questo è il problema – zsounder

9

Ecco come le icone sono impostate all'interno di 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; 
     }; 
    }; 

Se si desidera ottenere l'icona di utilizzo dell'app sottostante codice:

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

PS: UIImage preleva automaticamente l'icona adatta per display retina.

Spero che aiuti !!

16

La risposta accettata non ha funzionato per me, sto usando il metodo Images.xcassets di Xcode 5 per la memorizzazione delle icone delle app. Questa modifica ha funzionato per me:

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

In caso di dubbio, semplicemente esplorare infoDictionary del fascio principale utilizzando lldb.

+1

Un po 'più breve: 'UIImage * appIcon = [UIImmagine imageNamed: [[NSBundle mainBundle] .infoDictionary [@" CFBundleIcons "] [@" CFBundlePrimaryIcon "] [@" CFBundleIconFiles "] firstObject]]; ' – pkamb

8

Se si utilizzano i cataloghi di attività, allora si può semplicemente utilizzare:

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

cataloghi Asset sembrano per standardizzare i nomi dei file per le icone di app.

Certamente se è necessario elencare tutte le icone di app nel pacchetto, è possibile cercarlo nel dizionario di informazioni CFBundleIconFiles.

Usando KVC si può facilmente ottenere che in una sola riga di codice:

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

risultante array conterrà tutti i nomi App Icon disponibili nel bundle. Uno qualsiasi di questi nomi possono essere usati per recuperare icona usando +[UIImage imageNamed:]

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

Perché mi c'è voluto un po 'di tempo a lavorare fuori, ecco una soluzione Swift lavoro.

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

Ecco un Swift 3.x estensione a UIApplication per ottenere l'icona dell'applicazione.È possibile scegliere se ottenere l'icona più piccola o più grande in base alla posizione del percorso dell'icona estratta dall'array 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 
    } 
} 

Per accedere l'icona, chiamare il seguente:

let icon = UIApplication.shared.icon 

per i punti bonus, si potrebbe anche fare due vars per ottenere l'icona più piccolo e più grande se la vostra applicazione bisogno.

+1

La prima riga del codice Swift 3 restituisce" Tipo "Qualsiasi" non ha membri di indice " – Crazor

+0

@Crazor Grazie, il codice inizialmente funzionava quando ho eseguito il test in una versione beta, ma ho visto l'errore segnalato e aggiornato il codice. – CodeBender

2

Se stai usando 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); 

Sulla base Andy's answer utilizzando il metodo KVC. Un po 'lungo, ma usare KeyPath è meglio che concatenare le chiamate a ValueForKey.