From 1d26df390b5d678fc407a7ac144c77384b822e49 Mon Sep 17 00:00:00 2001 From: Jairo Tylera Date: Thu, 1 Nov 2018 00:28:30 +0100 Subject: [PATCH] Add AutoLayoutSizeSource (#110) A SizeSource that calculates a view size based on its auto-layout constraints. Update AutoLayoutSizeSource It now supports updating the view with a given closure, and customization of the fittingPriority for layout size calculations. Fixed code linting --- Sources/SizeSource/AutoLayoutSizeSource.swift | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 Sources/SizeSource/AutoLayoutSizeSource.swift diff --git a/Sources/SizeSource/AutoLayoutSizeSource.swift b/Sources/SizeSource/AutoLayoutSizeSource.swift new file mode 100644 index 0000000..c4313ee --- /dev/null +++ b/Sources/SizeSource/AutoLayoutSizeSource.swift @@ -0,0 +1,28 @@ +import UIKit + +public typealias ClosureViewUpdateFn = (View, Data, Int) -> Void + +open class AutoLayoutSizeSource: SizeSource { + private let dummyView: View + private let dummyViewUpdater: ClosureViewUpdateFn + private let horizontalFittingPriority: UILayoutPriority + private let verticalFittingPriority: UILayoutPriority + public init(dummyView: View.Type, + horizontalFittingPriority: UILayoutPriority = .defaultHigh, + verticalFittingPriority: UILayoutPriority = .defaultLow, + viewUpdater: @escaping ClosureViewUpdateFn) { + + self.dummyView = View() + self.dummyViewUpdater = viewUpdater + self.horizontalFittingPriority = horizontalFittingPriority + self.verticalFittingPriority = verticalFittingPriority + } + open override func size(at index: Int, data: Data, collectionSize: CGSize) -> CGSize { + self.dummyViewUpdater(self.dummyView, data, index) + + return self.dummyView.systemLayoutSizeFitting( + collectionSize, + withHorizontalFittingPriority: self.horizontalFittingPriority, + verticalFittingPriority: self.verticalFittingPriority) + } +}