From 9e33bde231d2a8319c26c4a371ebf352e9af8f85 Mon Sep 17 00:00:00 2001 From: ndreisg Date: Thu, 11 Mar 2021 18:30:52 +0100 Subject: [PATCH] Fixed column width calculation Use actual width of strings when system font is applied instead of assuming 14 pixels per character --- SwiftDataTables/Classes/Cells/DataCell/DataCell.swift | 2 +- .../Extensions/SwiftDataTable+Extensions.swift | 8 ++++++++ .../Classes/Models/DataStructureModel.swift | 2 +- SwiftDataTables/Classes/SwiftDataTable.swift | 11 +++-------- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/SwiftDataTables/Classes/Cells/DataCell/DataCell.swift b/SwiftDataTables/Classes/Cells/DataCell/DataCell.swift index b45a74a..44e7058 100755 --- a/SwiftDataTables/Classes/Cells/DataCell/DataCell.swift +++ b/SwiftDataTables/Classes/Cells/DataCell/DataCell.swift @@ -11,7 +11,7 @@ import UIKit class DataCell: UICollectionViewCell { //MARK: - Properties - private enum Properties { + public enum Properties { static let verticalMargin: CGFloat = 5 static let horizontalMargin: CGFloat = 15 static let widthConstant: CGFloat = 20 diff --git a/SwiftDataTables/Classes/Extensions/SwiftDataTable+Extensions.swift b/SwiftDataTables/Classes/Extensions/SwiftDataTable+Extensions.swift index 41eae04..c280f38 100755 --- a/SwiftDataTables/Classes/Extensions/SwiftDataTable+Extensions.swift +++ b/SwiftDataTables/Classes/Extensions/SwiftDataTable+Extensions.swift @@ -29,3 +29,11 @@ extension UIScrollView { self.contentOffset = CGPoint(x: -contentInset.left, y: -contentInset.top) } } + +extension String { + func widthOfString(usingFont font: UIFont) -> CGFloat { + let fontAttributes = [NSAttributedString.Key.font: font] + let size = self.size(withAttributes: fontAttributes) + return size.width + } +} diff --git a/SwiftDataTables/Classes/Models/DataStructureModel.swift b/SwiftDataTables/Classes/Models/DataStructureModel.swift index ca07022..80c48cf 100755 --- a/SwiftDataTables/Classes/Models/DataStructureModel.swift +++ b/SwiftDataTables/Classes/Models/DataStructureModel.swift @@ -77,7 +77,7 @@ public struct DataStructureModel { for column in Array(0.. CGFloat { let columnAverage: CGFloat = CGFloat(dataStructure.averageDataLengthForColumn(index: index)) - let sortingArrowVisualElementWidth: CGFloat = 20 // This is ugly - let averageDataColumnWidth: CGFloat = columnAverage * self.pixelsPerCharacter() + sortingArrowVisualElementWidth + let sortingArrowVisualElementWidth: CGFloat = 10 // This is ugly + let averageDataColumnWidth: CGFloat = columnAverage + sortingArrowVisualElementWidth + (DataCell.Properties.horizontalMargin * 2) return max(averageDataColumnWidth, max(self.minimumColumnWidth(), self.minimumHeaderColumnWidth(index: index))) } @@ -701,12 +701,7 @@ extension SwiftDataTable { } func minimumHeaderColumnWidth(index: Int) -> CGFloat { - return CGFloat(self.pixelsPerCharacter() * CGFloat(self.dataStructure.headerTitles[index].count)) - } - - //There should be an automated way to retrieve the font size of the cell - func pixelsPerCharacter() -> CGFloat { - return 14 + return CGFloat(self.dataStructure.headerTitles[index].widthOfString(usingFont: UIFont.boldSystemFont(ofSize: 17))) } func heightForPaginationView() -> CGFloat {