Created basic main view, dates missing
This commit is contained in:
		
							
								
								
									
										64
									
								
								TrashTrack/AspectVGrid.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								TrashTrack/AspectVGrid.swift
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | ||||
| // | ||||
| //  AspectVGrid.swift | ||||
| //  TrashTrack | ||||
| // | ||||
| //  Created by Oliver Hnát on 13.01.2024. | ||||
| // | ||||
|  | ||||
| import SwiftUI | ||||
|  | ||||
| struct AspectVGrid<Item, ItemView>: View where ItemView: View, Item: Identifiable { | ||||
|     var items: [Item] | ||||
|     var aspectRatio: CGFloat | ||||
|     var content: (Item) -> ItemView | ||||
|      | ||||
|     init(items: [Item], aspectRatio: CGFloat, @ViewBuilder content: @escaping (Item) -> ItemView) { | ||||
|         self.items = items | ||||
|         self.aspectRatio = aspectRatio | ||||
|         self.content = content | ||||
|     } | ||||
|      | ||||
|     var body: some View { | ||||
|         GeometryReader { geometry in | ||||
|             VStack { | ||||
|                 let width: CGFloat = widthThatFits(itemCount: items.count, in: geometry.size, itemAspectRatio: aspectRatio) | ||||
|                 LazyVGrid(columns: [adaptiveGridItem(width: width)], spacing: 0) { | ||||
|                     ForEach(items) { item in | ||||
|                         content(item).aspectRatio(aspectRatio, contentMode: .fit) | ||||
|                     } | ||||
|                 } | ||||
|                 Spacer(minLength: 0) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     private func adaptiveGridItem(width: CGFloat) -> GridItem { | ||||
|         var gridItem = GridItem(.adaptive(minimum: width)) | ||||
|         gridItem.spacing = 0 | ||||
|         return gridItem | ||||
|     } | ||||
|      | ||||
|     private func widthThatFits(itemCount: Int, in size: CGSize, itemAspectRatio: CGFloat) -> CGFloat { | ||||
|         var columnCount = 1 | ||||
|         var rowCount = itemCount | ||||
|         repeat { | ||||
|             let itemWidth = size.width / CGFloat(columnCount) | ||||
|             let itemHeight = itemWidth / itemAspectRatio | ||||
|             if CGFloat(rowCount) * itemHeight < size.height { | ||||
|                 break | ||||
|             } | ||||
|             columnCount += 1 | ||||
|             rowCount = (itemCount + (columnCount-1)) / columnCount | ||||
|         } while columnCount < itemCount | ||||
|         if columnCount > itemCount { | ||||
|             columnCount = itemCount | ||||
|         } | ||||
|         return floor(size.width / CGFloat(columnCount)) | ||||
|     } | ||||
| } | ||||
|  | ||||
| //struct AspectVGrid_Previews: PreviewProvider { | ||||
| //    static var previews: some View { | ||||
| //        AspectVGrid() | ||||
| //    } | ||||
| //} | ||||
		Reference in New Issue
	
	Block a user