Подтвердить что ты не робот

Загрузить значок приложения с xcassets

Я хочу отобразить значок приложения внутри своего приложения. Значок находится в каталоге активов по умолчанию (Images.xcassets).

Как вы его загрузите? Я попробовал следующее, и все они вернули nil:

image = [UIImage imageNamed:@"AppIcon"];
image = [UIImage imageNamed:@"icon"];
image = [UIImage imageNamed:@"icon-76"];
image = [UIImage imageNamed:@"icon-60"];

Другие изображения в каталоге активов работают как ожидалось.

4b9b3361

Ответ 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)