WedX - журнал о программировании и компьютерных науках

(Swift) Элемент панели вкладок: пользовательское выбранное изображение с рендерингом как исходное не отображается

Прежде всего, я новичок в Swift, поэтому извиняюсь, если я упускаю что-то очевидное или использую неправильную терминологию.

Цель: установить выбранное изображение элемента панели вкладок на собственное изображение.

Работает следующая настройка (выбранный элемент - собственное изображение):

| UITabBarController | => | UIViewController | (настройка с раскадровкой)

class MyViewController: UIViewController {  
    override func viewDidLoad() {
        super.viewDidLoad()
        let customSelectedImage = UIImage (named: "selected-image")?.withRenderingMode(.alwaysOriginal)
        self.tabBarItem.selectedImage = customSelectedImage
    }
}

Но эта настройка не работает (выбранный элемент по умолчанию имеет синий оттенок):

| UITabBarController | => | UINavigationController | => | UIViewController | (настройка с раскадровкой - см. здесь)

Код аналогичен приведенному выше, но добавлен (программно) подвид UICollectionView в UIViewController.

class MyViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {  
    override func viewDidLoad() {
        super.viewDidLoad()
        let customSelectedImage = UIImage (named: "selected-image")?.withRenderingMode(.alwaysOriginal)
        self.tabBarItem.selectedImage = customSelectedImage
        ...
        //Some UICollectionView related code
        ...
    }
}

Некоторые вещи, которые могут быть полезны:

  • В сеансе отладки (см. Экран печати) => Просмотр иерархии пользовательского интерфейса: выбранный элемент ( помечен как класс UITabBarSwappableImageView) имеет правильное настраиваемое изображение, но по умолчанию используется синий оттенок. Я пробовал использовать разные пользовательские изображения, и похоже, что они скрыты другим (по умолчанию?) Представлением ...
  • Если я изменю функцию UITabBar.appearance (). TintColor = UIColor.red в приложении AppDelegate.swift (... didFinishLaunchingWithOptions ...), тогда выбранный элемент будет иметь красный (против синего) оттенок.

Что творится?


Ответы:


1

Расширяю UITabBarController:

extension UITabBarController {

    func updateTabBarItem(tab: Int, image: UIImage?) {

        guard let tabItems = tabBar.items, tab < tabItems.count && tab >= 0
            else { return }

        let tabItem = tabItems[tab]
        tabItem.image = image?.withRenderingMode(.alwaysOriginal)
        tabItem.selectedImage = tabItem.image

    }

}

Это поможет получить доступ к tabBar.items без загрузки каких-либо контроллеров представления (кроме первого контроллера представления вкладки 0).

class MyViewController: UIViewController {

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        tabBarController?.updateTabBarItem(tab: 1, image: UIImage(named: "selected-image")) // update the second tab's image here (just for example)
    }

}

Например, если вы хотите изменить выбранное изображение вкладки 2, сделайте точку останова на viewDidLoad: на втором контроллере представления вы обнаружите, что точка останова не сработала, поэтому изображение элемента вкладки не будет обновлено.

28.12.2016
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]