A SwiftUI component that arranges subviews in a hexagonal grid.


The library is based on the SwiftUI’s Layout protocol and thus has the following deployment requirement:

iOS 16.0+, iPadOS 16.0+, macOS 13.0+, Mac Catalyst 16.0+, tvOS 16.0+, watchOS 9.0+

The component’s signature:

HexGrid(_ data: Data,
        id: KeyPath<Data.Element, ID>,
        spacing: CGFloat = .zero,
        @ViewBuilder content: @escaping (Data.Element) -> Content)

The Data.Element should conform to OffsetCoordinateProviding. This protocol has a single requirement of providing an offsetCoordinate with row and column in a hex grid. The component assumes odd-q offset coordinate system.

The component assumes that subviews fill the bounds of the hexagon.

The package also exports a Hexagon shape with a flat-top orientation.


A grid of colors:


HexGrid(cells) { cell in

But you can put images or literally any view into subviews!

HexGrid(cells) { cell in
    AsyncImage(url: cell.url) { image in
        image.resizable().aspectRatio(contentMode: .fill)
    } placeholder: {
        ProgressView().frame(maxWidth: .infinity, maxHeight: .infinity)


You can add HexGrid to an Xcode project by adding it as a package dependency.


If you want to use HexGrid in a SwiftPM project, it’s as simple as adding it to a dependencies clause in your Package.swift:

dependencies: [
    .package(url: "https://github.com/ksemianov/HexGrid", from: "0.1.0")


This library is released under the MIT license. See LICENSE for details.


View Github