Created
August 8, 2022 16:20
-
-
Save ryanlintott/ab2326b61de24d233073a0703c56aa8c to your computer and use it in GitHub Desktop.
A SwiftUI view that uses ViewThatFits to present an SFSymbol tshirt that fits.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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