Сегодня мы рассмотрим, как создать несколько значков приложений, таких как приложение Apple WWDC.

Начиная

UITableViewController

Первое, что вам нужно сделать, это настроить базовый UITableViewController.

import UIKit
class ViewController: UITableViewController {
    fileprivate let cellId = "cellId"
    override func viewDidLoad() {
        super.viewDidLoad()
    
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellId)
    }
}

extension ViewController {
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 2
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath)
        return cell
    }
}

Импорт и настройка значков приложений

Затем создайте новую папку с именем «Значки приложений» или как вы хотите ее называть. Мы будем хранить наши активы в этой папке, а не в папке Assets.xcassets. Перетащите ресурсы значка приложения в только что созданную папку и установите флажок «копировать элементы при необходимости».

Поскольку мы не используем шаблон значка приложения Assets.xcassests, нам необходимо его удалить. Щелкните «Assets.xcassests», щелкните правой кнопкой мыши «AppIcon» и выберите «Удалить выбранные элементы».

Теперь перейдите к обзору проекта, я думаю, это то, что он называется ... Прокрутите немного вниз и выберите раскрывающийся список рядом с «Источник значков приложений» и нажмите «Не использовать каталоги ресурсов».

После выбора «Не использовать каталоги ресурсов» он может быть красным и по-прежнему писать «AppIcon», это просто ошибка в xcode, поэтому не беспокойтесь об этом.

Затем мы вернемся к файлу ViewController.swift и создадим массив, содержащий все имена изображений, которые мы будем использовать. fileprivate let appIcons = [ "red", "blue", "green", "orange", "yellow" ]

Внутри «numberOfRowsInSection» измените количество возвращаемых элементов на return appIcons.count,

и внутри "cellForRowAt" добавьте cell.textLabel?.text = appIcons[indexPath.row]

Info.plist

Теперь щелкните правой кнопкой мыши «Info.plist», выберите «Открыть как» и выберите «Исходный код». Вставьте этот код сразу под первым ».

<key>CFBundleIcons</key>
    <dict>
        <key>CFBundlePrimaryIcon</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>YOUR PRIMARY APP ICON NAME HERE</string>
            </array>
            <key>UIPrerenderedIcon</key>
            <false/>
        </dict>
        <key>CFBundleAlternateIcons</key>
        <dict>
            <key>YOUR SECONDARY APP ICON NAME HERE</key>
            <dict>
                <key>CFBundleIconFiles</key>
                <array>
                    <string>YOUR SECONDARY APP ICON NAME HERE</string>
                </array>
                <key>UIPrerenderedIcon</key>
                <false/>
            </dict>
        </dict>
    </dict>

добавьте этот код для каждого дополнительного значка приложения внутри словаря CFBundleAlternateIcons.

<key>YOUR SECONDARY APP ICON NAME HERE</key>
    <dict>
        <key>CFBundleIconFiles</key>
        <array>
            <string>YOUR SECONDARY APP ICON NAME HERE</string>
        </array>
        <key>UIPrerenderedIcon</key>
        <false/>
    </dict>

Поскольку у нас есть пять значков, наш код будет…

<key>CFBundleIcons</key>
    <dict>
        <key>CFBundlePrimaryIcon</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>red_icon</string>
            </array>
            <key>UIPrerenderedIcon</key>
            <false/>
        </dict>
        <key>CFBundleAlternateIcons</key>
        <dict>
            <key>red_icon</key>
            <dict>
                <key>CFBundleIconFiles</key>
                <array>
                    <string>red_icon</string>
                </array>
                <key>UIPrerenderedIcon</key>
                <false/>
            </dict>
        <key>blue_icon</key>
            <dict>
                <key>CFBundleIconFiles</key>
                <array>
                    <string>blue_icon</string>
                </array>
                <key>UIPrerenderedIcon</key>
                <false/>
            </dict>
            <key>green_icon</key>
            <dict>
                <key>CFBundleIconFiles</key>
                <array>
                    <string>green_icon</string>
                </array>
                <key>UIPrerenderedIcon</key>
                <false/>
            </dict>
            <key>orange_icon</key>
            <dict>
                <key>CFBundleIconFiles</key>
                <array>
                    <string>orange_icon</string>
                </array>
                <key>UIPrerenderedIcon</key>
                <false/>
            </dict>
            <key>yellow_icon</key>
            <dict>
                <key>CFBundleIconFiles</key>
                <array>
                    <string>yellow_icon</string>
                </array>
                <key>UIPrerenderedIcon</key>
                <false/>
            </dict>
        </dict>
    </dict>

Теперь наш Info.plist должен выглядеть примерно так.

Измените значок приложения

В ViewController.swift создайте функцию с именем «setAppIcon» и сделайте так, чтобы она принимала параметр с именем «_ named» и имела тип «String». func setAppIcon(_ named: String?) {}

Внутри функции «setAppIcon» добавьте UIApplication.shared.setAlternateIconName(named) { (error) in if let error = error { print(error.localizedDescription) } }

Теперь давайте добавим override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {}. Создадим константу с именем 'row' и установим его равным 'indexPath.row' let row = indexPath.row

Теперь мы собираемся использовать оператор switch, чтобы определить, какие ячейки нажимаются и какой значок приложения отображать. Мы собираемся создать кейс для каждого значка приложения, который у вас есть, в каждом случае мы будем вызывать нашу функцию setAppIcon, которую мы создали ранее. Установите для первого значка приложения значение «nil», потому что оно установлено как значок приложения по умолчанию в нашем info.plist. Для других значков приложений будут установлены имена импортированных файлов, а регистр по умолчанию также будет «ноль».

switch row {
        case 0: setAppIcon(nil)
        case 1: setAppIcon("blue-icon")
        case 2: setAppIcon("green-icon")
        case 3: setAppIcon("orange-icon")
        case 4: setAppIcon("yellow-icon")
        default: setAppIcon(nil)
        }

Наш окончательный код должен выглядеть примерно так.

import UIKit
class ViewController: UITableViewController {
    fileprivate let cellId = "cellId"
    fileprivate let appIcons = [
        "red",
        "blue",
        "green",
        "orange",
        "yellow"
    ]
    override func viewDidLoad() {
        super.viewDidLoad()
    
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellId)
    }

    fileprivate func setAppIcon(_ named: String?) {
        UIApplication.shared.setAlternateIconName(named) { (error) in
            if let error = error {
                print(error.localizedDescription)
            }
        }
    }
}

extension ViewController {
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return appIcons.count
}

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath)
        cell.textLabel?.text = appIcons[indexPath.row]
        return cell
}
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if UIApplication.shared.supportsAlternateIcons {
            let row = indexPath.row
        
            switch row {
            case 0: setAppIcon(nil)
            case 1: setAppIcon("blue-icon")
            case 2: setAppIcon("green-icon")
            case 3: setAppIcon("orange-icon")
            case 4: setAppIcon("yellow-icon")
            default: setAppIcon(nil)
            }
        }
    }
}

Давайте запустим приложение и убедимся, что все работает правильно.

Потрясающие! Все работает!