Загрузить значок приложения с xcassets
Я хочу отобразить значок приложения внутри своего приложения. Значок находится в каталоге активов по умолчанию (Images.xcassets
).
Как вы его загрузите? Я попробовал следующее, и все они вернули nil
:
image = [UIImage imageNamed:@"AppIcon"];
image = [UIImage imageNamed:@"icon"];
image = [UIImage imageNamed:@"icon-76"];
image = [UIImage imageNamed:@"icon-60"];
Другие изображения в каталоге активов работают как ожидалось.
Ответы
Ответ 1
Проверяя пакет, я обнаружил, что изображения значков были переименованы в:
AppIcon76x76~ipad.png
[email protected]~ipad.png
[email protected]
И так далее.
Таким образом, используя [UIImage imageNamed:@"AppIcon76x76"]
или подобные работы.
Является ли это документированным где-нибудь?
Ответ 2
Я рекомендую получить URL-адрес значка, проверив Info.plist
, так как нет никакой гарантии, как имена файлов значков:
NSDictionary *infoPlist = [[NSBundle mainBundle] infoDictionary];
NSString *icon = [[infoPlist valueForKeyPath:@"CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles"] lastObject];
imageView.image = [UIImage imageNamed:icon];
В этом случае мы извлекаем последний URL-адрес изображения из массива CFBundleIconFiles. Он имеет наибольшее разрешение. Измените это, если вам нужно меньшее разрешение.
Ответ 3
После ответа Ортвина подход Swift 4:
func getHighResolutionAppIconName() -> String? {
guard let infoPlist = Bundle.main.infoDictionary else { return nil }
guard let bundleIcons = infoPlist["CFBundleIcons"] as? NSDictionary else { return nil }
guard let bundlePrimaryIcon = bundleIcons["CFBundlePrimaryIcon"] as? NSDictionary else { return nil }
guard let bundleIconFiles = bundlePrimaryIcon["CFBundleIconFiles"] as? NSArray else { return nil }
guard let appIcon = bundleIconFiles.lastObject as? String else { return nil }
return appIcon
}
Затем его можно использовать как:
let imageName = getHighResolutionAppIconName()
myImageView.image = UIImage(named: imageName)