У меня есть такая панель вкладок:

Средняя кнопка - это просто UIImage, который добавляется в подкласс tabBarController следующим образом:
class TabBarDelegate: UITabBarController {
let button = UIImageView()
override func viewDidLoad() {
super.viewDidLoad()
delegate = self
self.tabBar.unselectedItemTintColor = #colorLiteral(red: 0.6666666865, green: 0.6666666865, blue: 0.6666666865, alpha: 1)
button.backgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
button.image = UIImage(named: "tabBarAdd")
button.setImageColor(color: #colorLiteral(red: 0.184496969, green: 0.6701939702, blue: 0.3898918033, alpha: 1))
let imageView = UIImageView()
imageView.image = UIImage(named: "tabBarAdd")
imageView.bounds = CGRect(x: button.frame.origin.x, y: button.frame.origin.y, width: button.frame.width, height: button.frame.height)
self.view.insertSubview(button, aboveSubview: self.tabBar)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
button.frame = CGRect.init(x: self.tabBar.center.x - 17.5, y: self.view.bounds.height - 80, width: 35, height: 35)
button.layer.cornerRadius = 17.5
}
}
В настоящее время у моего изображения неправильный цвет, поэтому я использую расширение для изменения цвета, которое является функцией button.setImageColor(color: _) в коде.
Средняя кнопка работает нормально, когда я нажимаю на нее, касание просто проходит через изображение и до tabBarItem.
Что я хотел бы сделать, так это при переходе к контроллеру среднего вида, чтобы скрыть изображение.
Я пробовал использовать функцию viewDidAppear() в появившемся viewController. Я использовал этот код:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let tabBarD = TabBarDelegate()
tabBarD.button.isHidden = true
}
но это не работает. Я также попытался полностью удалить изображение из супервизора с помощью tabBarD.button.removeFromSuperview(), но даже это не сработало.
Буду рад любым идеям и помощи.
Заранее спасибо :)





В вашем методе viewDidAppear для middleViewController вы фактически инициализируете новый TabBarController, поэтому он не работает так, как вы предполагали.
Удалите этот код и добавьте два метода к вашему базовому ViewControllers в tabBarController, viewWillDisAppear и viewWillAppear:
func viewWillDisappear(_ animated: Bool) {
super.viewWilDisappear(animated)
if let tabBarController = self.tabBarController as? TabBarDelegate {
tabBarController.button.isHidden = true
}
}
func viewWillAppear(_ animated: Bool) {
super.viewWilAppear(animated)
if let tabBarController = self.tabBarController as? TabBarDelegate {
tabBarController.button.isHidden = false
}
}
Таким образом, каждый раз, когда вы переходите к другому viewController (предположительно подробный viewController, из базовых контроллеров tabBarController, вы скрываете его, когда одно из представлений baseViewController собирается исчезнуть, затем вы снова делаете его видимым, если представление снова появится .
Попробуйте в своем middleViewController, обновите свой метод viewWillAppear в своем контроллере, где бы вы ни писали это как мою реализацию. Затем также добавьте viewWillDisAppear и скройте его, как я и для вашего middleViewController.
Я понял!
Спасибо emrepun, который заставил меня по-другому думать, как решить эту проблему!
В итоге я использовал расширение метода делегата, например:
extension TabBarDelegate: UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
if viewController.hidesBottomBarWhenPushed {
self.button.isHidden = true
}
return true
}
}
И поскольку я использовал метод hidesBottomBarWhenPushed из раскадровки, это сработало!
Спасибо за ваше время
Такой подход выглядит неплохо, рад, что смог помочь :)
Извините, это не сработало. Панель вкладок не имеет методов viewWillApear и excluar, которые вызываются, когда они отображаются в middleViewController.