public class GridLayout: UICollectionViewFlowLayout { private let itemsPerRow: CGFloat = 3 private let sectionInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) override func prepare() { super.prepare() guard let collectionView = collectionView else { return } let availableWidth = collectionView.frame.width - sectionInsets.left - sectionInsets.right let itemWidth = (availableWidth / itemsPerRow).rounded(.down) minimumInteritemSpacing = 10 minimumLineSpacing = 10 itemSize = CGSize(width: itemWidth, height: itemWidth) sectionInset = sectionInsets } }
class CircleLayout: UICollectionViewLayout { let itemSize = CGSize(width: 50, height: 50) var attributesList = [UICollectionViewLayoutAttributes]() var center = CGPoint.zero var radius: CGFloat = 0 override var collectionViewContentSize: CGSize { return collectionView!.frame.size } override func prepare() { super.prepare() let numberOfItems = collectionView!.numberOfItems(inSection: 0) let angle = 2 * CGFloat.pi / CGFloat(numberOfItems) attributesList = (0..This example shows a custom UICollectionViewLayout that creates a circular pattern using the items. It overrides the prepare method to generate the layout attributes for each item, setting their center and size. The Cocoapods package library is called "UICollectionViewFlowLayout".UICollectionViewLayoutAttributes in let attributes = UICollectionViewLayoutAttributes(forCellWith: IndexPath(item: i, section: 0)) attributes.size = itemSize let x = center.x + radius * cos(angle * CGFloat(i)) let y = center.y + radius * sin(angle * CGFloat(i)) attributes.center = CGPoint(x: x, y: y) return attributes } } override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { return attributesList } override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? { return attributesList[indexPath.row] } }