Fixes misc. iPhone X layout issues

This commit is contained in:
Riley Testut 2017-11-29 01:41:05 -08:00
parent c0ffa10fff
commit bb418038e2
5 changed files with 56 additions and 17 deletions

@ -1 +1 @@
Subproject commit d7213260852683ea5a3f6c2274733bbd65d2ec92
Subproject commit dd292d6ceaa1c0543e3dd0453251379287a923a7

View File

@ -23,22 +23,52 @@ class GridCollectionViewLayout: UICollectionViewFlowLayout
// If only one row, distribute the items equally horizontally
var usesEqualHorizontalSpacingDistributionForSingleRow = false
private var contentInset: UIEdgeInsets {
guard let collectionView = self.collectionView else { return .zero }
var contentInset = collectionView.contentInset
if #available(iOS 11, *)
{
contentInset.left += collectionView.safeAreaInsets.left
contentInset.right += collectionView.safeAreaInsets.right
}
return contentInset
}
private var contentWidth: CGFloat {
guard let collectionView = self.collectionView else { return 0.0 }
let contentWidth = collectionView.bounds.width - (self.contentInset.left + self.contentInset.right)
return contentWidth
}
private var maximumItemsPerRow: Int {
let maximumItemsPerRow = Int(floor((self.contentWidth - self.minimumInteritemSpacing) / (self.itemWidth + self.minimumInteritemSpacing)))
return maximumItemsPerRow
}
private var interitemSpacing: CGFloat {
let interitemSpacing = (self.contentWidth - CGFloat(self.maximumItemsPerRow) * self.itemWidth) / CGFloat(self.maximumItemsPerRow + 1)
return interitemSpacing
}
override var estimatedItemSize: CGSize {
didSet {
fatalError("GridCollectionViewLayout does not support self-sizing cells.")
}
}
override func prepare()
{
super.prepare()
self.sectionInset.left = self.interitemSpacing + self.contentInset.left
self.sectionInset.right = self.interitemSpacing + self.contentInset.right
}
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]?
{
guard let collectionView = self.collectionView else { return nil }
let maximumItemsPerRow = floor((collectionView.bounds.width - self.minimumInteritemSpacing) / (self.itemWidth + self.minimumInteritemSpacing))
let interitemSpacing = (collectionView.bounds.width - maximumItemsPerRow * self.itemWidth) / (maximumItemsPerRow + 1)
self.sectionInset.left = interitemSpacing
self.sectionInset.right = interitemSpacing
let layoutAttributes = super.layoutAttributesForElements(in: rect)?.map({ $0.copy() }) as! [UICollectionViewLayoutAttributes]
var minimumY: CGFloat? = nil
@ -58,7 +88,7 @@ class GridCollectionViewLayout: UICollectionViewFlowLayout
if abs(attributes.frame.minX - self.sectionInset.left) > 1
{
attributes.frame.origin.x = previousLayoutAttributes.frame.maxX + interitemSpacing
attributes.frame.origin.x = previousLayoutAttributes.frame.maxX + self.interitemSpacing
}
}
@ -70,7 +100,7 @@ class GridCollectionViewLayout: UICollectionViewFlowLayout
{
isSingleRow = false
self.alignLayoutAttributes(tempLayoutAttributes, toMinimumY: minY)
self.align(tempLayoutAttributes, toMinimumY: minY)
// Reset tempLayoutAttributes
tempLayoutAttributes.removeAll()
@ -97,15 +127,15 @@ class GridCollectionViewLayout: UICollectionViewFlowLayout
// Handle the remaining tempLayoutAttributes
if let minimumY = minimumY
{
self.alignLayoutAttributes(tempLayoutAttributes, toMinimumY: minimumY)
self.align(tempLayoutAttributes, toMinimumY: minimumY)
if isSingleRow && self.usesEqualHorizontalSpacingDistributionForSingleRow
{
let spacing = (collectionView.bounds.width - (self.itemWidth * CGFloat(tempLayoutAttributes.count))) / (CGFloat(tempLayoutAttributes.count) + 1.0)
let spacing = (self.contentWidth - (self.itemWidth * CGFloat(tempLayoutAttributes.count))) / (CGFloat(tempLayoutAttributes.count) + 1.0)
for (index, layoutAttributes) in tempLayoutAttributes.enumerated()
{
layoutAttributes.frame.origin.x = spacing + (spacing + self.itemWidth) * CGFloat(index)
layoutAttributes.frame.origin.x = spacing + (spacing + self.itemWidth) * CGFloat(index) + self.contentInset.left
}
}
}
@ -117,7 +147,7 @@ class GridCollectionViewLayout: UICollectionViewFlowLayout
private extension GridCollectionViewLayout
{
func alignLayoutAttributes(_ layoutAttributes: [UICollectionViewLayoutAttributes], toMinimumY minimumY: CGFloat)
func align(_ layoutAttributes: [UICollectionViewLayoutAttributes], toMinimumY minimumY: CGFloat)
{
for attributes in layoutAttributes
{

View File

@ -23,6 +23,10 @@ class LaunchViewController: UIViewController
return self.gameViewController?.prefersStatusBarHidden ?? false
}
override func childViewControllerForHomeIndicatorAutoHidden() -> UIViewController? {
return self.gameViewController
}
override func viewDidAppear(_ animated: Bool)
{
super.viewDidAppear(animated)

View File

@ -33,7 +33,7 @@ class PausePresentationController: UIPresentationController
{
guard let containerView = self.containerView else { return super.frameOfPresentedViewInContainerView }
let frame: CGRect
var frame: CGRect
let contentHeight = self.presentedViewController.preferredContentSize.height
if contentHeight == 0
@ -44,6 +44,11 @@ class PausePresentationController: UIPresentationController
else
{
frame = CGRect(x: 0, y: containerView.bounds.height - contentHeight, width: containerView.bounds.width, height: containerView.bounds.height)
if #available(iOS 11.0, *)
{
frame.origin.y -= containerView.safeAreaInsets.bottom
}
}
return frame

View File

@ -101,7 +101,7 @@ extension SaveStatesViewController
// Use dimensions that allow two cells to fill the screen horizontally with padding in portrait mode
// We'll keep the same size for landscape orientation, which will allow more to fit
collectionViewLayout.itemWidth = (portraitScreenWidth - (averageHorizontalInset * 3)) / 2
collectionViewLayout.itemWidth = floor((portraitScreenWidth - (averageHorizontalInset * 3)) / 2)
switch self.mode
{