У меня есть класс UITabController
, внутри которого я создал экземпляр для пользовательского UINavigationBar
, который заинтересован в передаче его высоты другому UIViewController
. Ниже приведен код, который у меня есть внутри моего UITabController
класса:
import UIKit
class NewFileButtonPressedTabController: UITabBarController, UINavigationBarDelegate
{
let firstViewControllerInTabBar = FirstItemInTabBarOpenRolledSections()
let secondViewControllerInTabBar = SecondItemInTabBarHollowStructuralSections()
let navigationBar = CustomNavigationBar(navigationBarTitle: "'Blue Book' Catalogue Sections", leftBarButtonTarget: self, leftBarButtonSelector: #selector(buttonPressed(sender:)))
override func viewDidLoad() {
super.viewDidLoad()
navigationBar.delegate = self
view.addSubview(navigationBar)
firstViewControllerInTabBar.tabBarItem.image = UIImage(named: "notSelectedStateOpenSections")?.withRenderingMode(.alwaysOriginal)
firstViewControllerInTabBar.tabBarItem.selectedImage = UIImage(named: "selectedOpenSections")?.withRenderingMode(.alwaysOriginal)
firstViewControllerInTabBar.tabBarItem.tag = 0
secondViewControllerInTabBar.tabBarItem.image = UIImage(named: "notSelectedHollowSections")?.withRenderingMode(.alwaysOriginal)
secondViewControllerInTabBar.tabBarItem.selectedImage = UIImage(named: "selectedHollowSections")?.withRenderingMode(.alwaysOriginal)
secondViewControllerInTabBar.tabBarItem.tag = 1
let tabBarList = [firstViewControllerInTabBar, secondViewControllerInTabBar]
viewControllers = tabBarList
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
navigationBar.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
navigationBar.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
if #available(iOS 11, *) {
navigationBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
} else {
navigationBar.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
}
override func viewWillAppear(_ animated: Bool) {
setupConstraints()
}
func setupConstraints() {
firstViewControllerInTabBar.view.translatesAutoresizingMaskIntoConstraints = false
firstViewControllerInTabBar.view.topAnchor.constraint(equalTo: navigationBar.bottomAnchor).isActive = true
firstViewControllerInTabBar.view.bottomAnchor.constraint(equalTo: tabBar.topAnchor).isActive = true
firstViewControllerInTabBar.view.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
firstViewControllerInTabBar.view.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true
}
}
func position(for bar: UIBarPositioning) -> UIBarPosition {
return UIBarPosition.topAttached
}
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
if tabBarItem.tag == 0 {
let sb = storyboard?.instantiateViewController(withIdentifier: "FirstItemInTabBarOpenRolledSections") as! FirstItemInTabBarOpenRolledSections
print("tag 0 has been pressed")
print(navigationBar.frame.size.height)
sb.tabBarControllerNavigationBarHeight = navigationBar.frame.size.height
}
}
}
А ниже приведен код, который у меня есть внутри UIViewController
, который в основном представляет собой вид, отображаемый при нажатии первого TabBarItem, которому я хотел бы передать высоту navigationBar:
import UIKit
class FirstItemInTabBarOpenRolledSections: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
var tabBarControllerNavigationBarHeight: CGFloat?
override func viewDidLoad() {
super.viewDidLoad()
let customCollectionView = CustomCollectionView(layoutTopEdgeInset: 20, layoutBottomEdgeInset: 20, layoutLeftEdgeInset: 20, layoutRightEdgeInset: 20, totalWidthOfCollectionView: self.view.frame.width, totalHeightOfCollectionView: self.view.frame.height, minimumLayoutCellsHorizontalSpacing: 20, minimumLayoutCellsVerticalSpacing: 20, numberOfCellsPerRow: 2, numberOfCellsPerColumn: 4, viewThatCustomCollectionViewWillBeAddedTo: self.view, hostViewDelegate: self, hostViewDataSource: self)
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 8
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let myCell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell", for: indexPath)
myCell.backgroundColor = .blue
return myCell
}
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print("User tapped on itme \(indexPath.row)")
}
}
Тем не менее, каждый раз, когда я печатаю значение высоты панели навигации во втором окне, я получаю ноль, что означает, что значение не было успешно передано. Может ли кто-нибудь помочь мне разобраться, что я сделал не так?