Skip to content

Instantly share code, notes, and snippets.

@ryanlintott
Created August 8, 2022 16:20
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Embed
What would you like to do?
A SwiftUI view that uses ViewThatFits to present an SFSymbol tshirt that fits.
//
// ShirtThatFits.swift
// ShirtThatFits
//
// Created by Ryan Lintott on 2022-08-05.
//
import SwiftUI
enum Shirt: Int, RawRepresentable, CaseIterable, Identifiable, Hashable, Codable, View {
case xs
case s
case m
case l
case xl
var id: Self { self }
var string: String { String(describing: self).uppercased() }
var size: CGFloat {
switch self {
case .xs: return 100
case .s: return 150
case .m: return 220
case .l: return 300
case .xl: return 400
}
}
static var sizes: ClosedRange<CGFloat> {
let allSizes = allCases.map(\.size)
let min = allSizes.min() ?? 0
let max = allSizes.max() ?? 1
return min...max
}
var font: Font {
.system(size: size * 0.5)
}
var label: Text {
Text(string).font(font)
}
var body: some View {
Image(systemName: "tshirt")
.resizable()
.scaledToFit()
.overlay(label)
.frame(width: size)
}
}
struct ShirtThatFits: View {
var body: some View {
ViewThatFits(in: [.horizontal, .vertical]) {
ForEach(Shirt.allCases.reversed()) {
$0
}
}
}
}
struct ShirtThatFitsExample_Previews: PreviewProvider {
struct PreviewData: View {
@State private var size: CGFloat = 200
var body: some View {
VStack {
Spacer()
ZStack(alignment: .top) {
Image(systemName: "figure.stand")
.resizable()
.scaledToFit()
.padding(.horizontal, 30)
.alignmentGuide(.top) { d in
d[.top] + d.height * 0.24
}
ShirtThatFits()
.foregroundColor(.blue)
}
.frame(width: size)
Spacer()
Text("ShirtThatFits()")
.font(.largeTitle)
Slider(value: $size, in: Shirt.sizes)
.padding()
.frame(maxWidth: 400)
}
}
}
static var previews: some View {
PreviewData()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment