Skip to content
This repository was archived by the owner on Oct 18, 2022. It is now read-only.

Commit a88e4c5

Browse files
author
Anna-Mariia Shkarlinska
committed
Add an optional configuration struct for layout
1 parent 4a29bf4 commit a88e4c5

File tree

3 files changed

+61
-5
lines changed

3 files changed

+61
-5
lines changed

CarLensCollectionViewLayout.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
9518383821E4F31F00BEA6EB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9518382421E4F08300BEA6EB /* Assets.xcassets */; };
1818
9518383921E4F32800BEA6EB /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9518382921E4F08300BEA6EB /* AppDelegate.swift */; };
1919
9518383C21E4FFCA00BEA6EB /* CollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9518383B21E4FFCA00BEA6EB /* CollectionViewCell.swift */; };
20+
9518384821E623E800BEA6EB /* CarLensCollectionViewLayoutOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9518384721E623E800BEA6EB /* CarLensCollectionViewLayoutOptions.swift */; };
2021
955E4FD421CBFB2800B4C3BB /* CarLensCollectionViewLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 955E4FD221CBFB2800B4C3BB /* CarLensCollectionViewLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };
2122
958D17C021D66DF00067BED6 /* CarLensCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 958D17BF21D66DF00067BED6 /* CarLensCollectionViewCell.swift */; };
2223
/* End PBXBuildFile section */
@@ -56,6 +57,7 @@
5657
9518382921E4F08300BEA6EB /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
5758
9518382A21E4F08300BEA6EB /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
5859
9518383B21E4FFCA00BEA6EB /* CollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollectionViewCell.swift; sourceTree = "<group>"; };
60+
9518384721E623E800BEA6EB /* CarLensCollectionViewLayoutOptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CarLensCollectionViewLayoutOptions.swift; sourceTree = "<group>"; };
5961
955E4FCF21CBFB2800B4C3BB /* CarLensCollectionViewLayout.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CarLensCollectionViewLayout.framework; sourceTree = BUILT_PRODUCTS_DIR; };
6062
955E4FD221CBFB2800B4C3BB /* CarLensCollectionViewLayout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CarLensCollectionViewLayout.h; sourceTree = "<group>"; };
6163
955E4FD321CBFB2800B4C3BB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -126,6 +128,7 @@
126128
children = (
127129
955E4FD221CBFB2800B4C3BB /* CarLensCollectionViewLayout.h */,
128130
9505725D21D4D8FB009EA422 /* CarLensCollectionViewLayout.swift */,
131+
9518384721E623E800BEA6EB /* CarLensCollectionViewLayoutOptions.swift */,
129132
958D17BF21D66DF00067BED6 /* CarLensCollectionViewCell.swift */,
130133
9505725F21D4D922009EA422 /* CarLensLayoutAttributes.swift */,
131134
955E4FD321CBFB2800B4C3BB /* Info.plist */,
@@ -256,6 +259,7 @@
256259
isa = PBXSourcesBuildPhase;
257260
buildActionMask = 2147483647;
258261
files = (
262+
9518384821E623E800BEA6EB /* CarLensCollectionViewLayoutOptions.swift in Sources */,
259263
9505725E21D4D8FB009EA422 /* CarLensCollectionViewLayout.swift in Sources */,
260264
958D17C021D66DF00067BED6 /* CarLensCollectionViewCell.swift in Sources */,
261265
9505726021D4D922009EA422 /* CarLensLayoutAttributes.swift in Sources */,

CarLensCollectionViewLayout/CarLensCollectionViewLayout.swift

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ public final class CarLensCollectionViewLayout: UICollectionViewFlowLayout {
1111

1212
private var firstSetupDone = false
1313

14+
private let options: CarLensCollectionViewLayoutOptions
15+
1416
/// SeeAlso: UICollectionViewFlowLayout
1517
public override func prepare() {
1618
super.prepare()
@@ -19,14 +21,30 @@ public final class CarLensCollectionViewLayout: UICollectionViewFlowLayout {
1921
firstSetupDone = true
2022
}
2123

24+
25+
/// The initialization of the CarLensCollectionViewLayout.
26+
///
27+
/// - Parameters:
28+
/// - options: An optional additional configuration of the layout.
29+
public init(options: CarLensCollectionViewLayoutOptions = CarLensCollectionViewLayoutOptions()) {
30+
self.options = options
31+
super.init()
32+
}
33+
34+
public required init?(coder aDecoder: NSCoder) {
35+
self.options = CarLensCollectionViewLayoutOptions()
36+
super.init(coder: aDecoder)
37+
}
38+
2239
private func setup() {
2340
guard let collectionView = collectionView else { return }
2441
scrollDirection = .horizontal
25-
minimumLineSpacing = 20
26-
itemSize = CGSize(width: collectionView.bounds.width - 80, height: collectionView.bounds.height)
27-
let inset = (collectionView.bounds.width - itemSize.width) / 2
28-
collectionView.contentInset = .init(top: 0, left: inset, bottom: 0, right: inset)
29-
collectionView.decelerationRate = UIScrollView.DecelerationRate.fast
42+
minimumLineSpacing = options.minimumSpacing
43+
itemSize = CGSize(width: collectionView.bounds.width - 60, height: collectionView.bounds.height)
44+
let sidesInset = (collectionView.bounds.width - itemSize.width) / 2
45+
collectionView.contentInset = .init(top: 0, left: sidesInset, bottom: 0, right: sidesInset)
46+
collectionView.decelerationRate = options.decelerationRate
47+
collectionView.showsHorizontalScrollIndicator = options.shouldShowScrollIndicator
3048
}
3149

3250
/// SeeAlso: UICollectionViewFlowLayout
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
//
2+
// CarLensCollectionViewLayoutOptions.swift
3+
// CarLensCollectionViewLayout
4+
//
5+
// Copyright © 2019 Netguru. All rights reserved.
6+
//
7+
8+
import Foundation
9+
10+
/// The optional configuration of CarLensCollectionViewLayout.
11+
public struct CarLensCollectionViewLayoutOptions {
12+
13+
/// A minimum spacing between cells.
14+
let minimumSpacing: CGFloat
15+
16+
/// A deceleration for a scroll view.
17+
let decelerationRate: UIScrollView.DecelerationRate
18+
19+
/// A value indicating whether collection view should have a scroll indicator.
20+
let shouldShowScrollIndicator: Bool
21+
22+
/// The initialization of the optional layout configuration.
23+
///
24+
/// - Parameters:
25+
/// - minimumSpacing: A minimum spacing between cells. The default value is `20`.
26+
/// - decelerationRate: A deceleration for a scroll view. The default value is `.fast`.
27+
/// - shouldShowScrollIndicator: A value indicating whether collection view should have a scroll indicator. The default value is `false`.
28+
public init(minimumSpacing: CGFloat = 20, decelerationRate: UIScrollView.DecelerationRate = UIScrollView.DecelerationRate.fast, shouldShowScrollIndicator: Bool = false) {
29+
self.minimumSpacing = minimumSpacing
30+
self.decelerationRate = decelerationRate
31+
self.shouldShowScrollIndicator = shouldShowScrollIndicator
32+
}
33+
34+
}

0 commit comments

Comments
 (0)