์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- duno
- dfs
- ์ฐ์ํ์ค๋ถ๋ถ์์ด์ํฉ
- SQL
- ๊ธฐ์ด๋ฌธ๋ฒ
- ๊ณ ๋์ kit
- SwiftUI
- ๋์ ๊ณํ๋ฒ
- URLSession
- SwiftUI ํํ ๋ฆฌ์ผ
- Swift
- SOPT
- IOS
- binarySearch
- DynamicProgramming
- concurrency
- algorithm
- 0์ด๋์ด์๋๊ธธ
- algoritm
- ํ๋ก๊ทธ๋๋จธ์ค
- SwiftUI Tutorials
- ๋ค์ด๋๋ฏนํ๋ก๊ทธ๋๋ฐ
- GroupBy
- HAVIT
- discardableResult
- APPJAM
- Til
- ์ด์งํ์
- BFS
- GCD
- Today
- Total
suvera-dev ๐ฅฆ
SwiftUI) Drawing and Animation 1 - Drawing Paths and Shapes ๋ณธ๋ฌธ
๋๋์ด ์๋ก์ด ์ฑํฐ ์ ๋๋ค !
๋๋ก์ & ์ ๋๋ฉ์ด์ ์ฑํฐ์ ์ฒซ๋ฒ์งธ ๋ด์ฉ์
Drawing Path And Shapes ์ธ๋ฐ์ !
๊ฐ์๊ธฐ ์ ๋๋ก์์ด๋ ? ์ ๋ฒ๊น์ง ๋ง๋ค์๋ ๋๋๋งํฌ ์ฑ์ ๋ฑ์ง๋ฅผ ์ถ๊ฐํ ์์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค ^^.
์์ ๋ด์ฉ์ ๋ฒ์ญํด๋ณด๋ฉด,
์ฌ์ฉ์๋ค์ด ์์ ์ ๋ชฉ๋ก์ ์๋ ๋๋๋งํฌ๋ฅผ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ๋ฑ์ง๋ฅผ ๋ฐ๋๋ค๊ณ ํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ๋ฑ์ง๋ฅผ ๋ฐ์ผ๋ ค๋ฉด ๋ฑ์ง๋ฅผ ๋ง๋ค์ด์ผ๊ฒ ์ฃ ?
Path์ Shape๋ฅผ ๊ฒฐํฉํด์ ๋ฑ์ง๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ์์ ์์น๋ฅผ ๋ํ๋๋ ๋ค๋ฅธ Shape์ ๊ฒน์ณ๋๋ ๊ณผ์ ์ ์๋ดํฉ๋๋ค.
๋ค์ํ ์ข ๋ฅ์ ๋๋๋งํฌ๋ฅผ ์ํด ์ฌ๋ฌ ๊ฐ์ ๋ฑ์ง๋ฅผ ๋ง๋ค๊ณ , ๋ฐ๋ณต์ ์์ ๋ค๋ฅด๊ฒ ํ๊ฑฐ๋ ๊ฐ๋๋ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํด ๋ณด์ธ์.
๋ผ๊ณ ํ๋ค์ ! ๋ฐ๋ก ์์ํด๋ณด๊ฒ ์ต๋๋ค. ๋ฑ์ง ๊ทธ๋ฆฌ๋ฌ ๊ณ ๊ณ ์ฑ.
1. ๋ฑ์ง ๋ทฐ๋ฅผ ์ํ ๋๋ก์ Data ์์ฑํ๊ธฐ
๋ฑ์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํด์, ๋ฑ์ง์ ๋ฐฐ๊ฒฝ์ ๊ตฌ์ฑํ ์ ์๋ ์ก๊ฐํ ๋ชจ์์ ๊ทธ๋ฆฌ๊ธฐ ์ํด ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฅผ ์ ์ํด์ผํฉ๋๋ค.
1. HexagonParameters๋ผ๋ ์๋ก์ด ํ์ผ์ ๋ง๋ค๊ณ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ธํด์ฃผ์ธ์.
2. ๊ทธ ์์ ์ก๊ฐํ์ ํ ๋ณ์ ๋ํ๋ด๋ 3๊ฐ์ Point๋ค์ ์ ์ฅํ๊ธฐ ์ํด Segment ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ํฉ๋๋ค
- CGPoint๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด CoreGrapiccs๋ฅผ import.
3. ์๋ก์ด ๋ฐฐ์ด์ ์ถ๊ฐํ๊ณ , ์ก๊ฐํ์ ๊ฐ ๋ณ๋ง๋ค ํ๋์ฉ 6๊ฐ์ ์ธ๊ทธ๋จผํธ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- ๊ฐ๋ค์ ์ผ์ชฝ ์๋จ์ ์์ ์ผ๋ก ํ๋ ๋จ์ ์ฌ๊ฐํ์ ๋น์จ๋ก ์ ์ฅ.
- x์ถ์ด ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก, y์ถ์ด ์๋์ชฝ ๋ฐฉํฅ์ผ๋ก ์์.
- ๋์ค์๋ ์ด๋ฌํ ๋น์จ์ ์ฌ์ฉํ์ฌ ์ง์ ๋ ํฌ๊ธฐ์ ์ก๊ฐํ์ ์ค์ ์ขํ๋ฅผ ์ฐพ๋๋ค.
4. ์ก๊ฐํ์ ๋ชจ์์ ์กฐ์ ํ ์ ์๋ ๊ฐ์ ์ถ๊ฐํฉ๋๋ค.
import CoreGraphics
struct HexagonParameters {
struct Segment {
let line: CGPoint
let curve: CGPoint
let control: CGPoint
}
static let adjustment: CGFloat = 0.085
static let segments = [
Segment(
line: CGPoint(x: 0.60, y: 0.05),
curve: CGPoint(x: 0.40, y: 0.05),
control: CGPoint(x: 0.50, y: 0.00)
),
Segment(
line: CGPoint(x: 0.05, y: 0.20 + adjustment),
curve: CGPoint(x: 0.00, y: 0.30 + adjustment),
control: CGPoint(x: 0.00, y: 0.25 + adjustment)
),
Segment(
line: CGPoint(x: 0.00, y: 0.70 - adjustment),
curve: CGPoint(x: 0.05, y: 0.80 - adjustment),
control: CGPoint(x: 0.00, y: 0.75 - adjustment)
),
Segment(
line: CGPoint(x: 0.40, y: 0.95),
curve: CGPoint(x: 0.60, y: 0.95),
control: CGPoint(x: 0.50, y: 1.00)
),
Segment(
line: CGPoint(x: 0.95, y: 0.80 - adjustment),
curve: CGPoint(x: 1.00, y: 0.70 - adjustment),
control: CGPoint(x: 1.00, y: 0.75 - adjustment)
),
Segment(
line: CGPoint(x: 1.00, y: 0.30 + adjustment),
curve: CGPoint(x: 0.95, y: 0.20 + adjustment),
control: CGPoint(x: 1.00, y: 0.25 + adjustment)
)
]
}
2. ๋ฑ์ง์ ๋ฐฐ๊ฒฝ ๊ทธ๋ฆฌ๊ธฐ
SwiftUI์ ๊ทธ๋ํฝ API๋ฅผ ์ฌ์ฉํ์ฌ ์ปค์คํ ๋ฑ์ง ๋ชจ์์ ๊ทธ๋ฆฝ๋๋ค.
1. BadgeBackground๋ผ๋ ๋ทฐ๋ฅผ ํ๋ ์ถ๊ฐํด์ค๋๋ค.
2. Path ๋ชจ์์ ๋ฑ์ง์ ์ถ๊ฐํ๊ณ , fill() ์์ ์๋ฅผ ์ ์ฉํ์ฌ ๋ชจ์์ ๋ทฐ๋ก ๋ณํํฉ๋๋ค.
- Path๋ฅผ ์ฌ์ฉํ์ฌ ์ , ๊ณก์ ๋ฐ ๊ธฐํ ๊ทธ๋ฆฌ๊ธฐ ๊ธฐ๋ณธ ์์๋ฅผ ๊ฒฐํฉํ์ฌ ๋ฑ์ง์ ์ก๊ฐํ ๋ฐฐ๊ฒฝ๊ณผ ๊ฐ์ด ๋ณต์กํ ๋ชจ์์ ํ์ฑํฉ๋๋ค.
3. Path์ ์์์ ์ ์ถ๊ฐํฉ๋๋ค. ์ด ๋, ํฌ๊ธฐ๊ฐ 100 x 100 ํฝ์ ์ธ ์ปจํ ์ด๋๋ฅผ ๊ฐ์ ํฉ๋๋ค.
- move(to:) ๋ฉ์๋๋ ์์ ์์ ํ์ด๋ ์ฐํ์ด ํด๋น ์์ญ ์๋ฅผ ๋งด๋๋ฉฐ ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ์์ํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ฒ๋ผ ๋ชจ์ ๋ด๋ถ์์ ๊ทธ๋ฆฌ๊ธฐ ์ปค์๋ฅผ ์ด๋์ํต๋๋ค.
struct BadgeBackground: View {
var body: some View {
Path { path in
var width: CGFloat = 100.0
let height = width
path.move(
to: CGPoint(
x: width * 0.95,
y: height * 0.20
)
)
}
.fill(.black)
}
}
4. ๋ชจ์ ๋ฐ์ดํฐ์ ๊ฐ ์ ์ ๋ํ ์ ์ ๊ทธ๋ ค์ ๋๋ต์ ์ธ ์ก๊ฐํ ๋ชจ์์ ๋ง๋ญ๋๋ค.
- addLine(to:) ๋ฉ์๋๋ ํ๋์ ์ ์ ๊ฐ์ ธ์์ ๊ทธ๋ฆฝ๋๋ค. addLine(to:)์ ์ฐ์ ํธ์ถ์ ์ด์ ์ ์์ ์ ์ ์์ํ์ฌ ์ ์ ๊น์ง ์ด์ด์ง๋๋ค.
HexagonParameters.segments.forEach { segment in
path.addLine(
to: CGPoint(
x: width * segment.line.x,
y: height * segment.line.y
)
)
}
์ก๊ฐํ์ด ์ฝ๊ฐ ์ด์ํ๊ฒ ๋ณด์ธ๋ค๋ฉด ๊ฑฑ์ ํ์ง ๋ง์ธ์.
๋ชจ์์ ๋ชจ์๋ฆฌ์ ์๋ ๊ณก์ ๋ถ๋ถ์ ๋ฌด์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ๋ถ๋ถ์ ๋ค์์ ๊ณ์ฐํ ๊ฒ์ ๋๋ค.
5. addQuadCurve(to:control:) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฑ์ง์ ๋ชจ์๋ฆฌ์ ๋ํ ๋ฒ ์ง์ด ๊ณก์ ์ ๊ทธ๋ฆฝ๋๋ค.
- addLine ์๋์ ๋ฃ์ด์ค.
path.addQuadCurve(
to: CGPoint(
x: width * segment.curve.x,
y: height * segment.curve.y
),
control: CGPoint(
x: width * segment.control.x,
y: height * segment.control.y
)
)
6. GeometryReader๋ก Path๋ฅผ ๊ฐ์ธ๋ฉด, containing view์ ํฌ๊ธฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ์ ํ๋์ฝ๋ฉํ๋ ๋์ ์ปจํ ์ด๋์ ํฌ๊ธฐ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
- width์ height ์ค ๋ ์์ ๊ฐ์ ์ฌ์ฉํ๋ฉด, ์ปจํ ์ด๋ ๋ทฐ๊ฐ ์ ์ฌ๊ฐํ์ด ์๋๋๋ผ๋ aspect ratio?๋ฅผ ๋ณด์กด?ํ ์ ์์ต๋๋ค.
GeometryReader { geometry in
Path {
...
var width: CGFloat = min(geometry.size.width, geometry.size.height)
}
- Path๋ฅผ GeometryReader๋ก ๊ฐ์ธ๊ณ ๋ด๋ถ์ width ๊ฐ์ ์ค์ ํด์คฌ์ต๋๋ค.
7. xScale์ ์ฌ์ฉํ์ฌ x-์ถ์ ๋ฐ๋ผ ๋ชจ์์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ๋ค์ xOffset์ ์ถ๊ฐํ์ฌ ๋ชจ์์ ํด๋น geometry ์์์ ๋ค์ ์ค์์ ๋ฐฐ์นํฉ๋๋ค.
let xScale: CGFloat = 0.832
let xOffset = (width * (1.0 - xScale)) / 2.0
width *= xScale
- ์ด ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ๊ณ , x ์ขํ ๊ฐ์ ๋ชจ๋ + xOffset์ ํด์คฌ๋ค.
8. ๋์์ธ์ ๋ง๋ ๊ทธ๋ผ๋ฐ์ด์ ์ผ๋ก ๋จ์ ๊ฒ์ ๋ฐฐ๊ฒฝ์ ๋์ฒดํฉ๋๋ค.
static let gradientStart = Color(red: 239.0 / 255, green: 120.0 / 255, blue: 221.0 / 255)
static let gradientEnd = Color(red: 239.0 / 255, green: 172.0 / 255, blue: 120.0 / 255)
.fill(.linearGradient(
Gradient(colors: [Self.gradientStart, Self.gradientEnd]),
startPoint: UnitPoint(x: 0.5, y: 0),
endPoint: UnitPoint(x: 0.5, y: 0.6)
))
9. gradient ์ฑ์ฐ๊ธฐ์ aspectRatio(_:contentMode:) ์์ ์๋ฅผ ์ ์ฉํฉ๋๋ค.
1:1 aspect ratio๋ฅผ ๋ณด์กดํ๋ฉด, ๋ทฐ์ ๋ถ๋ชจ ๋ทฐ๊ฐ ์ ์ฌ๊ฐํ์ด ์๋ ๊ฒฝ์ฐ์๋ ๋ฐฐ์ง๊ฐ ๋ทฐ ์ค์์ ์์น๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
.aspectRatio(1, contentMode: .fit)
3. ๋ฑ์ง์ ์ฌ๋ณผ ๊ทธ๋ฆฌ๊ธฐ
Landmarks ๋ฐฐ์ง์๋ Landmarks ์ฑ ์์ด์ฝ์ ๋ํ๋๋ ์ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํ ์ปค์คํ ์์ด์ฝ์ด ์์ต๋๋ค.
์ฐ ๊ธฐํธ๋ ๊ผญ๋๊ธฐ์ ๋๋ฎ์ธ ๋ถ๋ถ์ ๋ํ๋ด๋ ํ๋์ ๋ชจ์๊ณผ, ๋ค๊ฐ์ค๋ ๊ธธ ๊ฐ์ฅ์๋ฆฌ์ ์๋ฌผ์ ๋ํ๋ด๋ ๋ค๋ฅธ ๋ชจ์์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
์ด๋ค์ ์์ ๊ฐ๊ฒฉ์ผ๋ก ๋ถ๋ฆฌ๋ ๋ ๋ถ๋ถ์ ์ผ๋ก ์ผ๊ฐํ ๋ชจ์์ผ๋ก ๊ทธ๋ ค๋ ๋๋ค.
1. ํ๋ก์ ํธ์ ์์ ์นดํ๋ก๊ทธ์์ ๋น AppIcon ํญ๋ชฉ์ ์ญ์ ํ ๋ค์, ๋ค์ด๋ก๋ํ ํ๋ก์ ํธ์ Resources ํด๋์์ AppIcon.appiconset ํด๋๋ฅผ ๋๋๊ทธํฉ๋๋ค.
2. BadgeSymbol์ด๋ผ๋ ์๋ก์ด ๋ทฐ๋ฅผ ๋ง๋์ธ์. ์ด ๋ทฐ๋ ๋ฐฐ์ง ๋์์ธ์์ ํ์ ํจํด์ผ๋ก ์ฐํ๋ ์ฐ ๋ชจ์์ ๋ํ๋ ๋๋ค.
3. ์ฌ๋ณผ์ ์๋จ๋ถ๋ถ ๊ทธ๋ฆฌ๊ธฐ - Path API ์ฌ์ฉ.
- ์ถ๊ฐ์ ์ผ๋ก, spacing, topWidth ๋ฐ topHeight ์์์ ๊ด๋ จ๋ ์ซ์์ ๊ณฑ์ ์กฐ์ ํ์ฌ ์ ๋ฐ์ ์ธ ๋ชจ์์ด ์ด๋ป๊ฒ ๋ณํํ๋์ง ํ์ธํด๋ณด๋ ์คํ์ ์ ์ํฉ๋๋ค.
4. ํ๋จ๋ถ๋ถ ๊ทธ๋ฆฌ๊ธฐ
- ๋์ผํ ๊ฒฝ๋ก ๋ด์์ ์ฌ๋ฌ ๊ฐ์ ๋ชจ์์ ๊ตฌ๋ถํ๊ธฐ ์ํด move(to:) ์์ ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๊ฒฉ์ ์ฝ์ ํฉ๋๋ค.
5. ์ฌ๋ณผ ์ปฌ๋ฌ ์ฑ์์ฃผ๊ธฐ
static let symbolColor = Color(red: 79.0 / 255, green: 79.0 / 255, blue: 191.0 / 255)
var body: some View {
GeometryReader { geometry in
Path { path in
let width = min(geometry.size.width, geometry.size.height)
let height = width * 0.75
let spacing = width * 0.030
let middle = width * 0.5
let topWidth = width * 0.226
let topHeight = height * 0.488
path.addLines([
CGPoint(x: middle, y: spacing),
CGPoint(x: middle - topWidth, y: topHeight - spacing),
CGPoint(x: middle, y: topHeight / 2 + spacing),
CGPoint(x: middle + topWidth, y: topHeight - spacing),
CGPoint(x: middle, y: spacing)
])
path.move(to: CGPoint(x: middle, y: topHeight / 2 + spacing * 3))
path.addLines([
CGPoint(x: middle - topWidth, y: topHeight + spacing),
CGPoint(x: spacing, y: height - spacing),
CGPoint(x: width - spacing, y: height - spacing),
CGPoint(x: middle + topWidth, y: topHeight + spacing),
CGPoint(x: middle, y: topHeight / 2 + spacing * 3)
])
}
.fill(Self.symbolColor)
}
}
6. ๋ค์์ผ๋ก, ํ์ ๋ ์ฌ๋ณผ์ ์บก์ํํ๊ธฐ ์ํด ์๋ก์ด RotatedBadgeSymbol ๋ทฐ๋ฅผ ์์ฑํฉ๋๋ค.
- ๋ฏธ๋ฆฌ๋ณด๊ธฐ์์ ๊ฐ๋๋ฅผ ์กฐ์ ํ์ฌ ํ์ ํจ๊ณผ๋ฅผ ํ ์คํธํฉ๋๋ค.
struct RotatedBadgeSymbol: View {
let angle: Angle
var body: some View {
BadgeSymbol()
.padding(-60)
.rotationEffect(angle, anchor: .bottom)
}
}
struct RotatedBadgeSymbol_Previews: PreviewProvider {
static var previews: some View {
RotatedBadgeSymbol(angle: Angle(degrees: 5))
}
}
๊ฒฐ๊ณผ๋ ์๋ ๊ฒ ๋ฉ๋๋ค !
4. ๋ฑ์ง์ ์ ๋ฉด๊ณผ ๋ฐฐ๊ฒฝ์ ๊ฒฐํฉํ๊ธฐ
์ด ๋ฐฐ์ง ๋์์ธ์์๋ ์ฐ ๋ชจ์์ด ํ์ ๋์ด ๋ฐฐ์ง ๋ฐฐ๊ฒฝ ์์ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณต๋๋๋ก ์ค๊ณ๋์์ต๋๋ค.
ํ์ ์ ์ํ ์๋ก์ด ํ์ ์ ์ ์ํ๊ณ ForEach ๋ทฐ๋ฅผ ํ์ฉํ์ฌ ์ฐ ๋ชจ์์ ์ฌ๋ฌ ๋ณต์ฌ๋ณธ์ ๋์ผํ ์กฐ์ (adjustments)์ ์ ์ฉํฉ๋๋ค.
1. Badge๋ผ๋ ์ด๋ฆ์ ์๋ก์ด ๋ทฐ๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
2. Badge๋ทฐ์ body์ BadgeBackground ๋ฅผ ๋ฐฐ์นํด์ค๋๋ค.
3. ๋ฐฐ์ง์ ์ฌ๋ณผ์ ๋ฐฐ์ง ๋ฐฐ๊ฒฝ ์์ ZStack์ ๋์ ๋ฐฐ์นํ์ธ์.
struct Badge: View {
var badgeSymbols: some View {
RotatedBadgeSymbol(angle: Angle(degrees: 0))
.opacity(0.5)
}
var body: some View {
ZStack {
BadgeBackground()
badgeSymbols
}
}
}
4. ์ฃผ๋ณ์ ๊ธฐํํ์ ์ธ ์์๋ฅผ ์ฝ๊ณ ์ฌ๋ณผ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ์ฌ ๋ฐฐ์ง ์ฌ๋ณผ์ ํฌ๊ธฐ๋ฅผ ์์ ํ์ธ์.
struct Badge: View {
var badgeSymbols: some View {
RotatedBadgeSymbol(angle: Angle(degrees: 0))
.opacity(0.5)
}
var body: some View {
ZStack {
BadgeBackground()
GeometryReader { geometry in
badgeSymbols
.scaleEffect(1.0 / 4.0, anchor: .top)
.position(x: geometry.size.width / 2.0, y: (3.0 / 4.0) * geometry.size.height)
}
}
}
}
5. ๋ฐฐ์ง ์ฌ๋ณผ์ ๋ณต์ฌ๋ณธ์ ํ์ ํ์ฌ ํ์ํ๊ธฐ ์ํด ForEach ๋ทฐ๋ฅผ ์ถ๊ฐํ์ธ์.
- 360๋์ ์์ ํ ํ์ ์ 8๊ฐ ์ธ๊ทธ๋จผํธ๋ก ๋ถํ ํ์ฌ ์ฐ ๋ชจ์ ์ฌ๋ณผ์ ๋ฐ๋ณตํจ์ผ๋ก์จ ํ์๊ณผ ๊ฐ์ ํจํด์ ๋ง๋ญ๋๋ค.
struct Badge: View {
var badgeSymbols: some View {
ForEach(0..<8) { index in
RotatedBadgeSymbol(
angle: .degrees(Double(index) / Double(8)) * 360.0
)
}
.opacity(0.5)
}
var body: some View {
ZStack {
BadgeBackground()
GeometryReader { geometry in
badgeSymbols
.scaleEffect(1.0 / 4.0, anchor: .top)
.position(x: geometry.size.width / 2.0, y: (3.0 / 4.0) * geometry.size.height)
}
}
.scaledToFit()
}
}
์ต์ข ๊ฒฐ๊ณผ๋ฌผ์ ์ด๋ ๊ฒ ๋ฉ๋๋ค.
ํ๊ธฐ
์ฌ์ค ์ด๋ฒ ํํ ๋ฆฌ์ผ์ ๊ทธ๋ฅ ๋ฐ๋ผํด๋ณด๋ ์ฌ๋ฏธ์๋ ๊ฒ ๊ฐ์์ !! ๋ง์น ๋์์ด๋๊ฐ ๋ ๊ธฐ๋ถ์ด๋๊น..
์ค์ ๋ก ์ ๋ฐ ํ์๋ชจ์์ ์ง์ ๋ง๋๋ ๊ฒฝ์ฐ๋ ์์ ๊ฒ ๊ฐ๊ณ .. (?) ํน์๋ชฐ๋ผ..?
์ซ์๋ ๊ณ์ฐ์ด ๋ง์ด ๋์ค๊ณ ์ข ๊ท์ฐฎ๊ธด ํ๋ค์...ใ
๊ทธ๋๋ ํฌ์คํ ํด๋๊ณ ํน์ ๋์ค์ ํ์ํ ์์๋ค์ด ๋ ์ค๋ฅธ๋ค๋ฉด ์ธ์ ๊ฐ ๋ค์ ์ฐพ์ ์๋ ์๊ฒ ์ฃ ..?
Containing View์ ํฌ๊ธฐ๋ฅผ ํ์ฉํ ์ ์๋ GeometryReader์ ๋ํ ๋ด์ฉ์ ์ ์ฉํ๋ ๊ฒ ๊ฐ์์.
Drawing์ ๋ํ modifier๋ ๋ค์ํ ์์๋ค์ ์๊ณ ์์ผ๋ฉด ๋์ค์ ์ปค์คํ ํ ๋ทฐ๋ฅผ ๋ง๋ค ๋๋ ๋์์ด ๋ ๊ฒ ๊ฐ๊ธดํ๋ค์ !
'iOS > SwiftUI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SwiftUI) SwiftUI Essentials 3 - Handling User Input (4) | 2023.03.31 |
---|---|
SwiftUI) SwiftUI Essentials - 2 Building Lists and Navigation (0) | 2023.03.29 |
SwiftUI) SwiftUI Essentials (8) | 2023.03.29 |