Shape 이란 2D 로 뷰에 나타내기 위한 모형입니다.

 

아래 기본적인 모형들입니다.

struct ContentView: View {
   var body: some View {
      VStack {
         ScrollView(.horizontal, showsIndicators: true) {
            HStack {
               Rectangle()
                  .frame(width: 100, height: 100)
               RoundedRectangle(cornerRadius: 25, style: .continuous)
                  .frame(width: 100, height: 100)
               Circle()
                  .frame(width: 100, height: 100)
               Ellipse()
                  .frame(width: 100, height: 50)
               Capsule()
                  .frame(width: 100, height: 50)
            }.padding()
         }
         Spacer()
      }
   }
}

 

추가적으로 .fill 메서드를 사용하게 되면 모형의 내부를 채울 수 있습니다. 내부를 채우기 위해서는 frame 같은 수정자들 앞에서 fill 이 사용되어야지 정상적으로 작동합니다.

Rectangle()
    .fill(Color.red)
    .frame(width: 100, height: 100)

 

다음으로 stroke modifier 를 사용하게 되면 경계 바깥쪽과 안쪽을 확장하게 됩니다. 반면 strokeBorder modifier 는 경계 안쪽을 확장하게 됩니다.

struct ContentView: View {
   var body: some View {
      HStack {
         RoundedRectangle(cornerRadius: 25)
            .stroke(Color.red, lineWidth: 20)
            .frame(width: 100, height: 100)
            .padding()
         RoundedRectangle(cornerRadius: 25)
            .strokeBorder(Color.red, lineWidth: 20)
            .frame(width: 100, height: 100)
            .padding()
      }
   }
}

 

Custom Stroke 만들기

다음으로 커스텀 Stroke 를 만드는 코드입니다. style 를 만들어 넣으면 됩니다.

lineWidth: 선의 너비

lineCap: 선 끝 종류 (.round, .butt, .square)

lineJoin: 선 결합 유형

miterLimit: 결합 시 Miter 사용 여부를 결정하는 임계값

dash: 선의 길이

struct ContentView: View {
    let lineStyle = StrokeStyle(lineWidth: 15, lineCap: .square, lineJoin: .round, miterLimit: 0, dash: [20], dashPhase: 0)

   var body: some View {
      RoundedRectangle(cornerRadius: 25)
         .stroke(Color.red, style: lineStyle)
         .frame(width: 100, height: 100)
   }
}

 

 

다음은 Capsule 를 사용한 후 버튼의 클릭 여부에 따라 background 의 색깔을 를 바꾸는 코드입니다.

struct ContentView: View {
   @State private var setActive: Bool = true

   var body: some View {
      VStack {
         Button(action: {
            setActive.toggle()
         }, label: {
            Text(setActive ? "Active" : "Inactive")
               .font(.title)
               .foregroundColor(Color.white)
               .padding(.horizontal, 30)
               .padding(.vertical, 10)
         })
         .background(setActive ? Color.green : Color.red, in: Capsule())
         Spacer()
      }.padding()
   }
}

 

'SwiftUI' 카테고리의 다른 글

Transferable  (0) 2023.12.22
PhotosPicker  (0) 2023.12.22
PreferenceKey Protocol  (0) 2023.12.19
GeometryReader  (0) 2023.12.19
horizontalSizeClass (make size different layout)  (0) 2023.12.19
ytw_developer