스위프트로 SwiftUI 방식으로 아이폰 앱 개발하기: 스케치 앱에 색상과 두께를 변경하는 기능 추가하기

최근 모바일 애플리케이션 개발에서 SwiftUI는 Apple의 사용자 인터페이스 툴킷으로서 매우 주목받고 있습니다. SwiftUI는 declarative 문법을 사용하여 UI를 구성할 수 있게 해주며, 이는 개발자가 코드를 작성하는 방식에 큰 변화를 가져왔습니다. 본 글에서는 SwiftUI를 이용해 스케치 앱을 개발하고, 이 앱에 사용자가 색상과 두께를 변경할 수 있는 기능을 추가하는 방법에 대해 자세히 설명하겠습니다.

1. SwiftUI란 무엇인가?

SwiftUI는 Apple의 모든 플랫폼에서 사용할 수 있는 선언형 UI 프레임워크입니다. SwiftUI를 사용하면 UI를 더 쉽고 직관적으로 개발할 수 있으며, 재사용 가능하고 모듈화된 컴포넌트를 생성할 수 있습니다. SwiftUI는 UIKit의 대안으로, 기존 UIKit와의 전환을 통해 코드의 가독성을 높이고, 유지보수를 용이하게 합니다.

2. 스케치 앱의 개요

스케치 앱은 사용자가 손으로 그림을 그릴 수 있는 애플리케이션으로, 다양한 기능을 통해 예술가와 일반 사용자 모두가 창의성을 표현할 수 있도록 돕습니다. 기본적으로는 화면에 터치를 통해 선을 그릴 수 있는 기능을 제공하지만, 사용자에게 추가적인 옵션(색상 선택기, 선 두께 조절 등)을 제공하면 앱의 유용성이 더욱 높아집니다.

3. 프로젝트 설정

SwiftUI 프로젝트를 설정하기 위해 Xcode를 사용하여 새로운 iOS 프로젝트를 생성합니다. 여기서는 ‘Single View App’ 템플릿을 선택하고 SwiftUI를 사용하도록 설정하겠습니다.

  1. Xcode를 열고 ‘Create a new Xcode project’를 선택합니다.
  2. ‘Single View App’을 선택하고 ‘Next’를 클릭합니다.
  3. 제품 이름을 입력하고 ‘Interface’를 ‘SwiftUI’로 설정합니다.
  4. 프로젝트를 생성합니다.

4. UI 구성하기

SwiftUI에서는 다양한 뷰를 조합하여 사용자 인터페이스를 구성할 수 있습니다. 기본 스케치 기능을 구현하기 위해 GeometryReader를 사용하여 터치 이벤트를 인식하고, drawing 코드를 추가해야 합니다.


        struct ContentView: View {
            // Drawing state
            @State private var lines: [Line] = []
            @State private var currentColor: Color = .black
            @State private var currentLineWidth: CGFloat = 5.0
            
            var body: some View {
                VStack {
                    ZStack {
                        // Drawing area
                        DrawingView(lines: $lines)
                            .background(Color.white)
                            .border(Color.gray, width: 1)
                        
                        VStack {
                            Spacer()
                            ColorPicker("색상 선택", selection: $currentColor)
                                .padding()
                            Slider(value: $currentLineWidth, in: 1...20, step: 1) {
                                Text("Line Width")
                            }.padding()
                        }
                    }
                }
                .onAppear {
                    // 초기 설정
                }
            }
        }
    

5. 터치 이벤트 처리와 그리기 기능 추가

DrawingView를 통해 실제 선을 그리는 기능을 구현합니다. 이 뷰에서는 터치 이벤트를 감지하고 사용자가 그리는 선을 저장해야 합니다.


        struct DrawingView: View {
            @Binding var lines: [Line]
            @State private var currentLine: Line?
            
            var body: some View {
                GeometryReader { geometry in
                    Path { path in
                        for line in lines {
                            path.addLines(line.points)
                        }
                        if let currentLine = currentLine {
                            path.addLines(currentLine.points)
                        }
                    }
                    .stroke(Color.black, lineWidth: 1.0)
                    .background(Color.white)
                    .gesture(DragGesture()
                        .onChanged { value in
                            let newPoint = value.location
                            if currentLine == nil {
                                currentLine = Line(points: [newPoint])
                            } else {
                                currentLine?.points.append(newPoint)
                            }
                        }
                        .onEnded { _ in
                            if let currentLine = currentLine {
                                lines.append(currentLine)
                            }
                            self.currentLine = nil
                        })
                }
            }
        }
    

6. 색상 및 두께 변경 기능 구현

사용자가 선택한 색상 및 그리기 두께를 반영하기 위해 drawing 기능을 수정할 필요가 있습니다.


        struct Line {
            var points: [CGPoint]
            var color: Color = .black
            var lineWidth: CGFloat = 5.0
            
            init(points: [CGPoint]) {
                self.points = points
            }
        }
        
        // DrawingView에서 사용되는 Stroke 색상과 두께 조정하기
        .stroke(currentColor, lineWidth: currentLineWidth)
    

7. 최종 테스트 및 디버깅

앱 개발이 완료되면, 실제 디바이스 또는 시뮬레이터에서 앱을 실행하여 모든 기능이 제대로 작동하는지 확인합니다. 여기서는 선이 정상적으로 그려지고 색상과 두께가 잘 수정되는지 테스트해야 합니다. 만약 버그가 발생할 경우, Xcode의 디버깅 툴을 사용하여 문제를 해결합니다.

8. 결론

SwiftUI를 사용하여 스케치 앱을 개발하고 색상 및 두께 조절 기능을 추가하는 과정을 살펴보았습니다. SwiftUI는 직관적이고 선언적인 방식으로 UI를 구성할 수 있게 하여 개발의 효율성을 높여줍니다. 앱을 제작하며 발생할 수 있는 다양한 문제들을 해결하고, 최종적으로 원하는 기능을 완성하는 과정은 앱 개발의 중요한 경험이 됩니다.

앞으로 SwiftUI의 다양한 기능을 적극 활용해 더 많은 프로젝트에 도전해 보시기 바랍니다.