diff --git a/Cores/DeltaCore b/Cores/DeltaCore index d721326..dd292d6 160000 --- a/Cores/DeltaCore +++ b/Cores/DeltaCore @@ -1 +1 @@ -Subproject commit d7213260852683ea5a3f6c2274733bbd65d2ec92 +Subproject commit dd292d6ceaa1c0543e3dd0453251379287a923a7 diff --git a/Delta/Components/Collection View/GridCollectionViewLayout.swift b/Delta/Components/Collection View/GridCollectionViewLayout.swift index bc4fbba..e87a1c4 100644 --- a/Delta/Components/Collection View/GridCollectionViewLayout.swift +++ b/Delta/Components/Collection View/GridCollectionViewLayout.swift @@ -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 { diff --git a/Delta/Launch/LaunchViewController.swift b/Delta/Launch/LaunchViewController.swift index c2d0be5..3b38c96 100644 --- a/Delta/Launch/LaunchViewController.swift +++ b/Delta/Launch/LaunchViewController.swift @@ -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) diff --git a/Delta/Pause Menu/Presentation Controller/PausePresentationController.swift b/Delta/Pause Menu/Presentation Controller/PausePresentationController.swift index c0fb79b..2bcea39 100644 --- a/Delta/Pause Menu/Presentation Controller/PausePresentationController.swift +++ b/Delta/Pause Menu/Presentation Controller/PausePresentationController.swift @@ -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 diff --git a/Delta/Pause Menu/Save States/SaveStatesViewController.swift b/Delta/Pause Menu/Save States/SaveStatesViewController.swift index 019be65..75ad69d 100644 --- a/Delta/Pause Menu/Save States/SaveStatesViewController.swift +++ b/Delta/Pause Menu/Save States/SaveStatesViewController.swift @@ -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 {