This PR contains all the work related to setting up this project as required to implement the [Assignment](https://repo.rock-n-code.com/rock-n-code/deep-linking-assignment/wiki/Assignment) on top, as intended. To summarise this work: - [x] created a new **Xcode** project; - [x] cloned the `Wikipedia` app and inserted it into the **Xcode** project; - [x] created the `Locations` app and also, its `Libraries` package; - [x] created the `Shared` package to share dependencies between the apps; - [x] added a `Makefile` file and implemented some **environment** and **help** commands. Co-authored-by: Javier Cicchelli <javier@rock-n-code.com> Reviewed-on: rock-n-code/deep-linking-assignment#1
53 lines
4.2 KiB
Swift
53 lines
4.2 KiB
Swift
public struct ColumnarCollectionViewLayoutMetrics {
|
|
public static let defaultItemLayoutMargins = UIEdgeInsets(top: 10, left: 15, bottom: 10, right: 15) // individual cells on each explore card
|
|
public static let defaultExploreItemLayoutMargins = UIEdgeInsets(top: 15, left: 15, bottom: 15, right: 15) // explore card cells
|
|
let boundsSize: CGSize
|
|
let layoutMargins: UIEdgeInsets
|
|
let countOfColumns: Int
|
|
let itemLayoutMargins: UIEdgeInsets
|
|
let readableWidth: CGFloat
|
|
let interSectionSpacing: CGFloat
|
|
let interColumnSpacing: CGFloat
|
|
let interItemSpacing: CGFloat
|
|
var shouldMatchColumnHeights = false
|
|
|
|
public static func exploreViewMetrics(with boundsSize: CGSize, readableWidth: CGFloat, layoutMargins: UIEdgeInsets) -> ColumnarCollectionViewLayoutMetrics {
|
|
let useTwoColumns = boundsSize.width >= 600 || (boundsSize.width > boundsSize.height && readableWidth >= 500)
|
|
let countOfColumns = useTwoColumns ? 2 : 1
|
|
let interColumnSpacing: CGFloat = useTwoColumns ? 20 : 0
|
|
let interItemSpacing: CGFloat = 35
|
|
let interSectionSpacing: CGFloat = useTwoColumns ? 20 : 0
|
|
|
|
let layoutMarginsForMetrics: UIEdgeInsets
|
|
let itemLayoutMargins: UIEdgeInsets
|
|
let defaultItemMargins = ColumnarCollectionViewLayoutMetrics.defaultExploreItemLayoutMargins
|
|
let topAndBottomMargin: CGFloat = 30 // space between top of navigation bar and first section
|
|
if useTwoColumns {
|
|
let itemMarginWidth = max(defaultItemMargins.left, defaultItemMargins.right)
|
|
let marginWidth = max(max(max(layoutMargins.left, layoutMargins.right), round(0.5 * (boundsSize.width - (readableWidth * CGFloat(countOfColumns))))), itemMarginWidth)
|
|
layoutMarginsForMetrics = UIEdgeInsets(top: topAndBottomMargin, left: marginWidth - itemMarginWidth, bottom: topAndBottomMargin, right: marginWidth - itemMarginWidth)
|
|
itemLayoutMargins = UIEdgeInsets(top: defaultItemMargins.top, left: itemMarginWidth, bottom: defaultItemMargins.bottom, right: itemMarginWidth)
|
|
} else {
|
|
let marginWidth = max(layoutMargins.left, layoutMargins.right)
|
|
itemLayoutMargins = UIEdgeInsets(top: defaultItemMargins.top, left: marginWidth, bottom: defaultItemMargins.bottom, right: marginWidth)
|
|
layoutMarginsForMetrics = UIEdgeInsets(top: topAndBottomMargin, left: 0, bottom: topAndBottomMargin, right: 0)
|
|
}
|
|
|
|
return ColumnarCollectionViewLayoutMetrics(boundsSize: boundsSize, layoutMargins: layoutMarginsForMetrics, countOfColumns: countOfColumns, itemLayoutMargins: itemLayoutMargins, readableWidth: readableWidth, interSectionSpacing: interSectionSpacing, interColumnSpacing: interColumnSpacing, interItemSpacing: interItemSpacing, shouldMatchColumnHeights: false)
|
|
}
|
|
|
|
|
|
public static func tableViewMetrics(with boundsSize: CGSize, readableWidth: CGFloat, layoutMargins: UIEdgeInsets, interSectionSpacing: CGFloat = 0, interItemSpacing: CGFloat = 0) -> ColumnarCollectionViewLayoutMetrics {
|
|
let marginWidth = max(max(layoutMargins.left, layoutMargins.right), round(0.5 * (boundsSize.width - readableWidth)))
|
|
var itemLayoutMargins = ColumnarCollectionViewLayoutMetrics.defaultItemLayoutMargins
|
|
itemLayoutMargins.left = max(marginWidth, itemLayoutMargins.left)
|
|
itemLayoutMargins.right = max(marginWidth, itemLayoutMargins.right)
|
|
return ColumnarCollectionViewLayoutMetrics(boundsSize: boundsSize, layoutMargins: .zero, countOfColumns: 1, itemLayoutMargins: itemLayoutMargins, readableWidth: readableWidth, interSectionSpacing: interSectionSpacing, interColumnSpacing: 0, interItemSpacing: interItemSpacing, shouldMatchColumnHeights: false)
|
|
}
|
|
|
|
public static func exploreCardMetrics(with boundsSize: CGSize, readableWidth: CGFloat, layoutMargins: UIEdgeInsets) -> ColumnarCollectionViewLayoutMetrics {
|
|
let itemLayoutMargins = ColumnarCollectionViewLayoutMetrics.defaultItemLayoutMargins
|
|
return ColumnarCollectionViewLayoutMetrics(boundsSize: boundsSize, layoutMargins: layoutMargins, countOfColumns: 1, itemLayoutMargins: itemLayoutMargins, readableWidth: readableWidth, interSectionSpacing: 0, interColumnSpacing: 0, interItemSpacing: 0, shouldMatchColumnHeights: false)
|
|
}
|
|
}
|