반응형
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
}
}
}
}
}
반응형
'개발 > SWIFT 아이폰' 카테고리의 다른 글
SwiftUI 앱 스토어 버전 확인 후 업데이트 (0) | 2023.08.02 |
---|---|
SwiftUI 티맵 내비 호출 및 경로 안내 (0) | 2023.07.25 |
SwiftUI Kingfisher 이미지 불러오기 (0) | 2023.07.24 |
SwiftUI Checkbox 생성 (0) | 2023.07.24 |
SwiftUI RadioButton 생성 (0) | 2023.07.24 |