개발/SWIFT 아이폰 / / 2023. 7. 25. 17:50

SwiftUI Slider로 화면 밝기 조절

반응형

SwiftUI 커스텀 슬라이더로 아이폰 화면 밝기 조절

 

CustomSliderView

// 커스텀 슬라이더 뷰
struct CustomSliderView: View {
    @Binding var value: Double // 슬라이더 값
    var minimumValue: Double // 최소값
    var maximumValue: Double // 최대값
    var lineColor: Color // 슬라이더 바 색상
    var thumbColor: Color // thumb(바늘) 색상

    var body: some View {
        GeometryReader { geometry in
            VStack {
                ZStack(alignment: .leading) {
                    Rectangle()
                        .foregroundColor(lineColor) // 슬라이더 바 색상 설정
                        .frame(height: 4) // 슬라이더 바 높이

                    Circle()
                        .foregroundColor(thumbColor) // thumb 색상 설정
                        .frame(width: 16, height: 16) // thumb 크기
                        .offset(x: self.thumbOffset(geometry: geometry) - 8) // 슬라이더 바에 맞추어 thumb 위치 설정
                        .gesture(DragGesture(minimumDistance: 0)
                            .onChanged { gestureValue in
                                self.onSliderValueChanged(gestureValue: gestureValue, geometry: geometry)
                            }
                        ) // 슬라이더 드래그 제스처 설정
                }
                .padding(.horizontal) // 슬라이더 바 양 옆 여백 설정
                
                Text("\(self.value, specifier: "%.1f")") // 슬라이더 값 표시 (소수점 첫째자리까지)
                    .font(.caption) // 텍스트 크기
            }
        }
    }

    // thumb 위치 계산
    private func thumbOffset(geometry: GeometryProxy) -> CGFloat {
        let trackWidth = geometry.size.width - 16 // thumb의 지름은 16로 가정
        let valueRange = maximumValue - minimumValue
        let valueRatio = CGFloat((value - minimumValue) / valueRange)
        return valueRatio * trackWidth
    }

    // 슬라이더 값 변경시 호출되는 함수
    private func onSliderValueChanged(gestureValue: DragGesture.Value, geometry: GeometryProxy) {
        let trackWidth = geometry.size.width - 16 // thumb의 지름은 16로 가정
        let dragLocation = gestureValue.location.x

        var value = (dragLocation / trackWidth) * CGFloat(maximumValue - minimumValue)
        value = min(max(value, 0), CGFloat(maximumValue - minimumValue))
        self.value = Double(value) + minimumValue
        
        // 아이폰의 화면 밝기 설정
        UIScreen.main.brightness = CGFloat(self.value / maximumValue)
    }
}

 

화면에 커스텀 슬라이더 생성

struct ContentView: View {
    @State private var brightnessValue: Double = Double(UIScreen.main.brightness) * 100 // 현재 밝기 값을 초기 값으로 설정

    var body: some View {
        VStack {
            CustomSliderView(value: $brightnessValue, minimumValue: 0, maximumValue: 100, lineColor: .yellow, thumbColor: .blue)
                .padding()
            
            Text("Brightness: \(brightnessValue, specifier: "%.1f")") // 밝기 값 표시 (소수점 첫째자리까지)
                .padding()
        }
        .onChange(of: brightnessValue, perform: { value in
            // 아이폰의 화면 밝기 설정
            UIScreen.main.brightness = CGFloat(value / 100)
        })
        .onAppear {
            // 앱 실행중 사용자가 설정에서 밝기를 조절할때
            NotificationCenter.default.addObserver(forName: UIScreen.brightnessDidChangeNotification, object: nil, queue: .main) { notification in
                let newBrightness = Double(UIScreen.main.brightness) * 100
                if brightnessValue != newBrightness {
                    brightnessValue = newBrightness
                }
            }
        }
    }
}

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유