Как изменить расположение панели вкладок в iOS 14

#ios #swift #uikit #uitabbarcontroller #uitabbar

#iOS #swift #uikit #uitabbarcontroller #uitabbar

Вопрос:

В моем приложении я хочу иметь возможность размещать UIView под моей панелью вкладок (для использования рекламного баннера). Я успешно реализовал UIView, но я не могу изменить расположение панели вкладок (панель вкладок должна находиться над UIView). Я пробую решения для iOS 13 и более ранних версий, но они не работают на iOS 14. Мой UIView по-прежнему находится на переднем плане над панелью вкладок. мой

Пример того, как я хочу, чтобы это было: пример

Теперь мой код:

 class MainTabBarController: UITabBarController {
...
lazy var bannerAd: UIView = {
   let view = UIView()
   view.translatesAutoresizingMaskIntoConstraints = false
   view.backgroundColor = .green
   return view
}()
...
override func viewDidLoad() {
   super.viewDidLoad()
   view.addSubview(bannerAd)
   bannerAd.heightAnchor.constraint(equalToConstant: 44).isActive = true
   bannerAd.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
   bannerAd.widthAnchor.constraint(equalTo: self.view.widthAnchor).isActive = true
}
...
override func viewWillLayoutSubviews() {
   super.viewWillLayoutSubviews()
   self.tabBar.invalidateIntrinsicContentSize()
   var tabFrame = self.tabBar.frame
   tabFrame.size.height = tabBarHeight
   tabFrame.origin.y = tabFrame.origin.y - 44
   self.tabBar.frame = tabFrame
   }
}
 

Ответ №1:

Вы можете попробовать (ключ в использовании viewDidLayoutSubviews вместо viewWillLayoutSubviews )

 class MainTabBarController: UITabBarController {
 
    lazy var bannerAd: UIView = {
       let view = UIView()
       view.translatesAutoresizingMaskIntoConstraints = false
       view.backgroundColor = .green
       return view
    }()
     
    override func viewDidLoad() {
       super.viewDidLoad()
       view.addSubview(bannerAd)
       bannerAd.heightAnchor.constraint(equalToConstant: 44).isActive = true
       bannerAd.leadingAnchor.constraint(equalTo: view.leadingAnchor)
       bannerAd.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
       bannerAd.widthAnchor.constraint(equalTo: self.view.widthAnchor).isActive = true
    }
     
    override func viewDidLayoutSubviews() {
       super.viewDidLayoutSubviews()
       self.tabBar.invalidateIntrinsicContentSize()
       var tabFrame = self.tabBar.frame
       tabFrame.size.height = 44
       tabFrame.origin.y = tabFrame.origin.y - 44
       self.tabBar.frame = tabFrame
       }
}
 

введите описание изображения здесь

Комментарии:

1. Боже! Это работает! Ты спас мне день)) Большое вам спасибо. Можете ли вы сказать мне, почему это не работает в viewWillLayoutSubviews()?

2. viewWillLayoutSubviews предшествует viewDidLayoutSubviews в стеке вызовов, вы должны использовать последний, где вычисляются правильные кадры и готовы к изменению

3. Возможно, вы скажете мне, как я могу вернуть местоположение панели вкладок во время работы приложения? Например, я хочу скрыть баннер и вернуть панель вкладок на свое место.