0

Прежде всего, я новичок в Swift, так что извиняюсь, если я пропущу что-то очевидное или использую неправильную терминологию.(Swift) Панель вкладок: Пользовательский выбранный образ с рендерингом asOriginal не показывает

Цель: set tab bar item selected image to custom image.

Следующая установка работает (выбранный элемент пользовательского образа):

| 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 | (setup w/storyboard - see here)

Аналогичный код, указанный выше, но добавленный (программно) подпрограмма 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 
     ... 
    } 
} 

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

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

Что происходит?

ответ

0

Выражает 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: на втором контроллере представления, вы найдете точку останова не попал, поэтому вкладка элемента, в изображение не будет обновляться.