On my iPhone 7 plus it's working fine, but on the simulator iPhone 5 SE the UIView
doesn't fill the screen only after I switch tabs or I scroll the view.
I'm using XLPagerTabStrip (9.0.0) to obtain two pages.
I added a UIView
with the blue background for debugging purposes, but what I want tot achieve is a list with books.
I want the UICollectionView
items to fill the entire screen, this is my implementation:
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
print(String(format: "width is: %f", collectionView.bounds.width))
return CGSize(width: collectionView.bounds.width, height: CGFloat(90))
}
This is what I got in the console: width is: 226.000000
, but after I scroll or I switch tabs, I get the following result: width is: 320.000000
I really don't know what's going on, the AutoLayout constraints are being set via storyboard from top-to-bottom and leading-to-trailing to fill the entire screen:
Please note: In the storyboard I've set the blue color to UIView
because I wanted to know where the width error comes from. (I guess it's coming from elsewhere and not from the UICollectionView
, because as you can see the UIView
doesn't fill the entire screen horizontally).
I've added some debug logs to see the lifecycle of the View Controllers
.
[ParentViewController]: viewControllers()
[ChildViewController]: viewDidLoad()
[ParentViewController]: viewDidLoad()
[ChildViewController]: viewWillAppear()
[ParentViewController]: viewWillAppear()
[ParentViewController]: viewDidLayoutSubviews()
[ChildViewController]: viewDidLayoutSubviews()
[ChildViewController]: viewDidLayoutSubviews()
[ChildViewController]: viewDidAppear()
[ParentViewController]: viewDidAppear()
(where: ParentViewController
is the main View Controller
, which holds the two child page View Controllers
)
I don't know why the [ParentViewController]: viewControllers()
is called before viewDidLoad()
. Maybe the error comes from here?
This is my implementation:
class ParentViewController: ButtonBarPagerTabStripViewController {
override func viewDidLoad() {
configureButtonBar()
super.viewDidLoad()
}
private func configureButtonBar() {
// set the button bar style (color, font size, green bar size, paddings, etc)
}
override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] {
let child1 = UIStoryboard.init(name: "ParentStoryboard", bundle: nil).instantiateViewController(withIdentifier: "ChildViewController") as! ChildViewController
child1.pageTitle = "TAB 1"
child1.entries = KData.shared().books
let child2 = UIStoryboard.init(name: "ParentStoryboard", bundle: nil).instantiateViewController(withIdentifier: "ChildViewController") as! ChildViewController
child2.pageTitle = "TAB 2"
child2.entries = KData.shared().booksWithAuthors
return [child1, child2]
}
}
And the ChildViewController
implementation:
class ChildViewController: UIViewController, IndicatorInfoProvider, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {
var pageTitle: String = ""
var entries: [Book]? = nil
@IBOutlet weak var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
collectionView.delegate = self
collectionView.dataSource = self
}
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
print(String(format: "width is: %f", collectionView.bounds.width))
return CGSize(width: collectionView.bounds.width, height: CGFloat(90))
}
}