ποΈπ¨Β μ‘μ‘ μλ νμΈμ μ΄μμ λλ€. μ΄λ² ν¬μ€ν μ λν΄μλ SwiftUIκ° μ 곡νλ λνμ λν΄μ ν¬μ€ν νκ³ μ ν΄μ. πΒ βΉοΈΒ π¨
SwiftUIμμ Shapeλ λ€μν λνμ κ·Έλ¦¬κ³ λμμΈνλ λ° μ¬μ©ν΄μ. Shape νλ‘ν μ½(protocol)μ UI λμμΈμ νμν κΈ°λ₯μ μ 곡νλ©°, λ€μν κΈ°λ³Έ λν λ° μ¬μ©μ μ§μ λνμ μμ±ν μ μμ΄μ. κΈ°λ³Έ λνμλ μ¬κ°ν, μ, νμ, λ₯κ·Ό μ¬κ°ν, λ₯κ·Ό μ λμ μΊ‘μ λ±μ΄ μμΌλ©°, μ΄λ¬ν λνμ μμ, μ μ€νμΌ, μ λκ» λ± λ€μν μ€νμΌλ‘ μ€νμΌλ§ν μ μμ΄μ.
SwiftUIμμ κΈ°λ³Έμ μΌλ‘ μ 곡ν΄μ£Όλ λνμ λ€μκ³Ό κ°μμ. κΈ°λ³Έ λνμ ν΅ν΄ μ½κ³ λΉ λ₯΄κ² λνμ λ§λ€ μ μμ΄μ.
import SwiftUI
struct ShapeBasic: View {
var body: some View {
VStack {
Rectangle().frame(width: 50, height: 50)
Circle().frame(width: 50, height: 50)
Ellipse().frame(width: 50, height: 50)
RoundedRectangle(cornerRadius:15).frame(width: 50, height: 50)
Capsule().frame(width: 80, height: 50)
}
}
}
#Preview {
ShapeBasic()
}
μΌκ°νκ³Ό κ°μ λνμ SwiftUIμμ κΈ°λ³Έμ μΌλ‘ μ 곡νμ§ μμμ. νμ§λ§ Path
structλ₯Ό ν΅ν΄ μ°λ¦¬κ° μνλ λνμ λ§λ€ μ μμ΄μ.
Path { path in
path.move(to: CGPoint(x: 200, y: 0)) // μμμ
path.addLine(to: CGPoint(x: 50, y: 200))
path.addLine(to: CGPoint(x: 350, y: 200))
}
SwiftUIμ Shapeλ μ€νμΌμ μ§μ ν μ μμ΄μ π. μλ₯Ό λ€λ©΄ λνμ μμ, μ μ€νμΌ, μ λκ» λ±μ μ€μ νμ¬ μνλ λνμ λ§λ€ μ μμ΄μ. λ€μν μ€νμΌ μ§μ λ°©λ²μ λν΄μ μμλ³Όκ²μ.
Rectangle()
.frame(width: 100, height: 100)
Rectangle()
.frame(minWidth: 200) // λνμ μ΅μ λλΉλ₯Ό 200μΌλ‘ μ€μ νμ΄μ.
// λ€λ₯Έ λ·°μ μν΄ λ°μνμΌλ‘ ν¬κΈ°κ° μ€μ΄λ€μ΄λ 200μ΄νλ‘λ μ€μ§ μμμ.
Rectangle()
.frame(minHeight: 200)
minWidth
μ minHeight
맀κ°λ³μλ λ·°κ° μ΅μνμ λλΉμ λμ΄λ₯Ό κ°μ ΈμΌνλ κ²½μ°μ μ¬μ©ν΄μ. μ΄λ¬ν μ μ½μ ν΅ν΄ λ·°κ° μ΅μ ν¬κΈ°λ₯Ό κ°κ² νκ±°λ νΉμ ν¬κΈ° λ―Έλ§μΌλ‘ μΆμλμ§ μλλ‘ λ°©μ§ν μ μμ΄μ.
Rectangle()
.fill(.blue)
.frame(width: 100, height: 100) // *frameμ μ€μ ν΄μ£Όμ§ μμΌλ©΄, λνμ΄ λ³΄μ΄μ§ μμμ!*
μ μ κ΅΅κΈ°μ κ°μ μ€νμΌμ StrokeStyle structλ₯Ό ν΅ν΄ μ€νμΌλ§ν μ μμ΄μ. μλλ StrokeStyleμ μ΄κΈ°νν λ μ¬μ©λλ μ΅μ λ€μ΄μμ. λͺ¨λ μ΅μ μ λ€ μ¬μ©ν νμλ μμΌλ©°, λ΄κ° μνλ μ΅μ λ§ μμ±μ 맀κ°λ³μμ λ£μ΄μ£Όλ©΄ λΌμ.
/// μ μ λλΉ.
/// The width of the stroked path.
public var lineWidth: CGFloat
/// μ μ λμ μ€νμΌ.
/// The endpoint style of a line.
public var lineCap: CGLineCap
/// μ μ κ²°ν© μ ν.
/// The join type of a line.
public var lineJoin: CGLineJoin
/// κ²°ν© λμ μ miterλ₯Ό μ¬μ©ν μ§ μ¬λΆλ₯Ό κ²°μ νλ μκ³κ°.
/// A threshold used to determine whether to use a bevel instead of a miter at a join.
public var miterLimit: CGFloat
/// λμ(dash)λ μ μ λ§λ€ λ μ¬μ©λλ κ·Έλ¦Όκ³Ό λΉκ·Έλ¦Ό μΈκ·Έλ¨ΌνΈμ κΈΈμ΄.
/// The lengths of painted and unpainted segments used to make a dashed line.
public var dash: [CGFloat]
/// λμ ν¨ν΄μμ μ μ΄ μμνλ μμΉ.
/// How far into the dash pattern the line starts.
public var dashPhase: CGFloat
π‘Β μΈκ·Έλ¨ΌνΈ(Segment)
: μ£Όλ‘ μ , κ²½λ‘ λλ 곑μ κ³Ό κ°μ κ·Έλν½ μμμμ νΉμ λΆλΆμ λνλ΄λ μ©μ΄μμ.
π‘Β κ·Έλ¦Ό(Painted) μΈκ·Έλ¨ΌνΈ
: μ μ μμμΌλ‘ μ±μμ§ λΆλΆμ λνλ΄μ. λ€μ λ§ν΄, μ μ μ€μ μμμ΄ λνλλ λΆλΆμ΄μμ.
π‘Β λΉκ·Έλ¦Ό(Unpainted) μΈκ·Έλ¨ΌνΈ
: μ μ΄ λΉμ΄μκ±°λ μμμ΄ μ±μμ§μ§ μμ λΆλΆμ λνλ΄μ.
StrokeStyleμ μμ±μλ₯Ό κ°μ Έμλ΄€μ΄μ. κΈ°λ³Έκ°κ³Ό μ΄λ€ νμ μ 맀κ°λ³μλ₯Ό λ°κ³ μλ μ§ νμΈν΄λ³΄μΈμ.
// StrokeStyle
public init(
lineWidth: CGFloat = 1,
lineCap: CGLineCap = .butt,
lineJoin: CGLineJoin = .miter,
miterLimit: CGFloat = 10,
dash: [CGFloat] = [CGFloat](),
dashPhase: CGFloat = 0
)
Rectangle()
.stroke(style: .init(
lineWidth: 5
))
.frame(width: 200, height: 200)
Rectangle()
.stroke(style: .init(
lineWidth: 5,
dash: [20, 5]
))
.frame(width: 200, height: 200)
Rectangle()
.opacity(0.5)
.frame(width: 200, height: 200)
Rectangle()
.shadow(color: .gray, radius: 5, x: 10, y: 10)
.frame(width: 200, height: 200)
color
: κ·Έλ¦Όμμ μμμ μ€μ ν©λλ€. μ΄ μμ μμλ νμ (Color.gray
)μΌλ‘ μ€μ νμ΄μ.
radius
: κ·Έλ¦Όμμ λΈλ¬(Blur) λ°κ²½μ μ€μ ν΄μ κ°μ΄ ν΄μλ‘ κ·Έλ¦Όμκ° λΈλ¬ μ²λ¦¬λΌμ.
x
μ y
: κ·Έλ¦Όμμ x μ y μ€νμ
μ μ€μ ν΄μ. κ·Έλ¦Όμμ μμΉλ₯Ό μ‘°μ ν μ μμ΄μ. x κ°μ΄ μμμΈ κ²½μ° μ€λ₯Έμͺ½μΌλ‘, μμμΈ κ²½μ° μΌμͺ½μΌλ‘ μ΄λνκ³ , y κ°μ΄ μμμΈ κ²½μ° μλλ‘, μμμΈ κ²½μ° μλ‘ μ΄λν΄μ.
μ΄λ² ν¬μ€ν μμλ SwiftUIμμ λν(Shape)μ λ€λ£¨λ λ°©λ²κ³Ό μ€νμΌλ§νλ λ°©λ²μ λν΄ μμ보μμ΄μ. λνμ iOS κ°λ°μ λ§μ΄ μ¬μ©λλ, μ μ΅νλμ΄ μ°½μμ μΈ μ± κ°λ°μ νμ©νμ ¨μΌλ©΄ μ’κ² μ΄μ π!