C'è un modo per ottenere l'icona dell'applicazione corrente in un'app cacao-touch? Grazie.Come ottenere l'icona dell'applicazione corrente in ios
risposta
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!)
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];
}
}
Sembra che il codice non funzioni bene. Non ho potuto ottenere icone, non so perché :(. – zsounder
Prova 'NSLog ([NSBundle mainBundle] infoDictionary]);' per scoprire se esiste un oggetto 'CFBundleIconFiles'. In caso contrario, c'è qualcosa di sbagliato nell'app – dom
L'oggetto callForKey restituisce l'id, a volte il tipo di id è realmente NSString ma non NSArray, forse questo è il problema – zsounder
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 !!
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.
Un po 'più breve: 'UIImage * appIcon = [UIImmagine imageNamed: [[NSBundle mainBundle] .infoDictionary [@" CFBundleIcons "] [@" CFBundlePrimaryIcon "] [@" CFBundleIconFiles "] firstObject]]; ' – pkamb
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
)
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)
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.
La prima riga del codice Swift 3 restituisce" Tipo "Qualsiasi" non ha membri di indice " – Crazor
@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
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.
Posso confermare che l'UIImage imageNamed ha chiamato il file @ 2x appropriato. Come nota: il fattore di scala modifica il dimensione dell'immagine –
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. –
Questo non funziona in Xcode 5 se si utilizza .xcassets – Siegfoult