Help us measure site usage?

With your permission, we use self-hosted analytics to understand page usage. It is optional and does not affect the Service. Learn more.

SwiftbeginnermobileAI generated

Photo Contact Sheet

Build an iPhone app that turns a selection of photos into a contact sheet: a single image with the photos arranged in a neat grid, each labeled with its date or a caption, like the sheets photographers use to review a shoot. You pick photos from your library, choose the number of columns, spacing and labels, preview the result, and save it back to Photos or share it. Your sheet layouts are remembered with SwiftData so you can reopen and edit them. It's a good first iOS project: you'll learn SwiftUI layouts, PhotosPicker, drawing images with ImageRenderer or UIGraphicsImageRenderer, SwiftData, and sharing with ShareLink.

Estimate
~9h
Steps
6
Completed by
0
Proposed by
codeseed.app

SwiftUI · SwiftData

Project roadmap

  1. 01

    Plan the app

    ~1h

    Write README.md: the screens (a list of saved sheets, and a sheet editor with photo selection, layout settings and a preview), the settings (columns from 2 to 6, spacing, background color, and labels: none, date taken or a custom caption) and the output (a PNG or JPEG image up to a maximum size). Create a SwiftUI project. Done when: README.md describes the screens, settings and output.

  2. 02

    Model sheets with SwiftData

    ~1.5h

    Create a SwiftData model ContactSheet with a title, creation date, the layout settings, and the chosen photos stored as PhotosPicker item identifiers plus small cached thumbnails. Build the list of sheets with @Query, with create and delete. Validate settings (columns within range and at least one photo before exporting). Done when: sheets are saved and listed after restarting the app.

  3. 03

    Pick photos

    ~1.5h

    Use PhotosPicker with multiple selection (up to 36 photos) to choose images, load them with loadTransferable, fix their orientation, and create small thumbnails for the editor. Show a message for photos that fail to load (for example iCloud photos while offline). Allow reordering and removing photos. Done when: selected photos appear in the editor in the chosen order.

  4. 04

    Lay out and render the sheet

    ~2h

    Build the sheet as a SwiftUI view: a grid (with LazyVGrid or Grid) of square-cropped photos with labels underneath, using the chosen columns, spacing and background. Render it to an image with ImageRenderer at a fixed width (for example 3,000 pixels) for good print quality. Show a preview that updates when settings change. Done when: changing settings updates the preview, and rendering produces a sharp image.

  5. 05

    Save and share

    ~1.5h

    Add a ShareLink to share the rendered image and a button to save it to the photo library (asking for add-only permission with a clear explanation, and handling refusal). Show a progress indicator while rendering large sheets. Done when: the sheet can be saved to Photos and shared to other apps.

  6. 06

    Test it

    ~1.5h

    Write unit tests for the layout calculations (rows needed, cell size for a given width and spacing), settings validation, and label formatting, plus a SwiftData test with an in-memory container. Test by hand with 1, 7 and 36 photos in portrait and landscape. Done when: the tests pass, and the manual checks look right.

Ready to build this?

Get a GitHub repo and start building. Your AI reviewer checks each step as you go.

~9h · 6 steps

Tech stack

SwiftUISwiftData