A SwiftUI view that uses ViewThatFits to present an SFSymbol tshirt that fits.
This file contains 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