システム開発<基本編>SwiftUIで色(HSB)のスライダ調整アプリ:Slider

Swift

前回は、SwiftUIで、Slider を利用して、色(RGB)スライダ調整が出来る

アプリケーションを開発する記事を紹介しました。

 

 

今回は、SwiftUIで、Slider を利用して、色(HSB)スライダ調整が出来る

アプリケーションを開発する記事を紹介します。

SwiftUIで色(HSB)のスライダ調整アプリ:Slider

 

 

習得内容

今回、SwiftUI色(HSB)スライダ調整が出来るアプリケーションを生成する事で、

下記の内容を習得する事が出来ます。

  • スライダSwiftUI色(HSB)スライダ調整(Slider)
  • 画像の回転・反転rotationEffect()rotation3DEffect()axis で、画像(Image)回転させたり、向きを変更します。
  • 画像の拡大・縮小scaleEffect() で、画像(Image)拡大・縮小が出来ます。

 

色の三属性:HSB

三属性(HSB)は、下記で構成されています。

  1. 色相(hue)などの色合いの事。0~360度角度で表現します。
  2. 彩度(saturation)鮮やかさの度合いの事。0~100%で表現します。
  3. 明度・輝度(brightness)明るさの度合いの事。0~100%で表現します。

 

三原色三要素の詳細については、下記を参照してみて下さい。

 

 

動作環境

今回も、アプリが動作する環境は下記になります。

  • mac OS:Sequoia 15.6.1
  • iOS:26.0
  • Xcode:26.0.1
  • Swift:6.2.1

 

 

色(HSB)スライダ調整アプリ

では、色(HSB)スライダ調整アプリを作成していきます。

 

Xcode の上部タブメニューより、File → New → File from Template を選択します。

 

SwiftUI View を選択します。

 

名称は、ColorSliderHSBView を入力してみます。

 

Create ボタンを押して、ColorSliderHSBView.swift を作成します。

 

ContentView:メインメニュー(ランチャー)

前回の記事で作成したメインメニュー(ランチャー)ContentView を確認します。

 


import SwiftUI

struct ContentView: View {

    @State var isPopupView_1 = false
    @State var isPopupView_2 = false
    @State var isPopupView_3 = false

    var body: some View {
        
        VStack{
            Button {
                self.isPopupView_1.toggle()
            } label: {
                Text("QRCodeView")
                    .font(.title2)
            }
            .fullScreenCover(isPresented: $isPopupView_1, content: {
                QRCodeView(isPopupView_1: $isPopupView_1)
            })
            .padding()

            Button {
                self.isPopupView_2.toggle()
            } label: {
                Text("ColorPickerView")
                    .font(.title2)
            }
            .sheet(isPresented: $isPopupView_2, content: {
                ColorPickerView(isPopupView_2: $isPopupView_2)
            })
            .padding()

            Button {
                self.isPopupView_3.toggle()
            } label: {
                Text("ColorSliderRGBView")
                    .font(.title2)
            }
            .sheet(isPresented: $isPopupView_3, content: {
                ColorSliderRGBView(isPopupView_3: $isPopupView_3)
            })
            .padding()
        }
    }
}

#Preview {
    ContentView()
}

 

メインメニュー(ランチャー)は、以下の内容です。

  • QRCodeView
  • ColorPickerView
  • ColorSliderRGBView

 

モーダル表示:sheet()

先程、作成した ColorSliderHSBView を ContentView のメニューに追加します。

 


import SwiftUI

struct ContentView: View {

    @State var isPopupView_1 = false
    @State var isPopupView_2 = false
    @State var isPopupView_3 = false
    @State var isPopupView_4 = false

    var body: some View {
        
        VStack{
            Button {
                self.isPopupView_1.toggle()
            } label: {
                Text("QRCodeView")
                    .font(.title2)
            }
            .fullScreenCover(isPresented: $isPopupView_1, content: {
                QRCodeView(isPopupView_1: $isPopupView_1)
            })
            .padding()

            Button {
                self.isPopupView_2.toggle()
            } label: {
                Text("ColorPickerView")
                    .font(.title2)
            }
            .sheet(isPresented: $isPopupView_2, content: {
                ColorPickerView(isPopupView_2: $isPopupView_2)
            })
            .padding()

            Button {
                self.isPopupView_3.toggle()
            } label: {
                Text("ColorSliderRGBView")
                    .font(.title2)
            }
            .sheet(isPresented: $isPopupView_3, content: {
                ColorSliderRGBView(isPopupView_3: $isPopupView_3)
            })
            .padding()

            Button {
                self.isPopupView_4.toggle()
                
            } label: {
                Text("ColorSliderHSBView")
                    .font(.title2)
            }
            .sheet(isPresented: $isPopupView_4, content: {
                ColorSliderHSBView(isPopupView_4: $isPopupView_4)
            })
            .padding()
        }
    }
}

#Preview {
    ContentView()
}

 

ColorPickerViewColorSliderRGBView 同様ColorSliderHSBView を呼び出す際、

モーダル表示をさせる sheet() を指定しました。

 

ColorSliderHSBView:色スライダ調整アプリ

色(HSB)スライダ調整アプリを作ってみます。

 

ソース例:ColorSliderHSBView

次に、ContentVeiw(親画面)から呼び出される ColorSliderHSBView(子画面)

ソースを紹介します。

 


import SwiftUI

struct ColorSliderHSBView: View {

    @Binding var isPopupView_4: Bool
    @State private var color: Color = .white

    @State private var hueRatio = 0.7  // 色相
    @State private var saturationRatio = 1.0  // 彩度
    @State private var brightnessRatio = 1.0  // 輝度
    @State private var opacity = 1.0  // 不透明

    var body: some View {
        ZStack {
            Color(red: 1.0, green: 0.75, blue: 1.0, opacity: 0.2)
                .edgesIgnoringSafeArea(.all)

            VStack {

                HStack {
                    Image(systemName: "thermometer.variable.and.figure")
                        .font(.system(size: 100))
                        .foregroundColor(Color(hue:hueRatio, saturation: saturationRatio, brightness: brightnessRatio, opacity: opacity))
                        .scaledToFill()
                        .rotationEffect(.degrees(hueRatio * 360))
                        .padding()

                    Image(systemName: "tortoise.fill")
                        .font(.system(size: 100))
                        .foregroundColor(Color(hue:hueRatio, saturation: saturationRatio, brightness: brightnessRatio, opacity: opacity))
                        .scaledToFill()
                        .rotation3DEffect(.degrees(180), axis: (x: 0, y: 1, z: 0))
                        .scaleEffect(opacity)
                        .padding()
                }

                VStack {
                    AdjustView(parameterName: "Hue", parameterColor: .cyan, parameterConst: 360.0, parameterUnit: "度", parameter: $hueRatio)

                    AdjustView(parameterName: "Saturation",parameterColor: .indigo, parameterConst: 100.0, parameterUnit: "%", parameter: $saturationRatio)
                    
                    AdjustView(parameterName: "Brightness", parameterColor: .brown, parameterConst: 100.0, parameterUnit: "%", parameter: $brightnessRatio)

                    AdjustView(parameterName: "Opacity", parameterColor: .purple, parameterConst: 100.0, parameterUnit: "%", parameter: $opacity)
                }
                .padding()

                Spacer()

                let adjust_color: Color = Color(hue:hueRatio, saturation: saturationRatio, brightness: brightnessRatio, opacity: opacity)

                Text("HEX : #\(adjust_color.hex)")
                    .font(.system(size:20))
                    .foregroundColor(.green)
                    .padding()

                Button(action: {
                    withAnimation {
                        self.isPopupView_4.toggle()
                    }
                }, label: {
                    Text("Close")
                        .font(.title2)
                        .foregroundColor(.black)
                })
                .padding()
            }
        }
    }
}

#Preview {
    ColorSliderHSBView(isPopupView_4: .constant(false))
}

  • ZStack { Color(red: 1.0, green: 0.75, blue: 1.0, opacity: 0.2)メインメニューから呼び出されて、覆い被さるので、メインメニュー区別する為、画面の土台となる部分にピンクを設定しています。
  • Image(systemName: “thermometer.variable.and.figure“):システムシンボル(SF Symbols)より、温度計アイコンを設定しています。
  • .foregroundColor(Color(hue:hueRatio, saturation: saturationRatio, brightness: brightnessRatioopacity: opacity)):アイコン明るさを設定している部分です。
  • Slider 明るさを調整すると、同時に温度計アイコン明るさが変わります。
  • .rotationEffect(.degrees(hueRatio * 360)):hueRatio Slider で、温度計アイコン回転させます。0 → 360度で、時計回り角度になります。初期値は、252.0度左下の向きまで回転します。
  • Image(systemName: “tortoise.fill“):システムシンボル(SF Symbols)より、カメアイコンを設定しています。
  • .foregroundColor(Color(hue:hueRatio, saturation: saturationRatio, brightness: brightnessRatioopacity: opacity)):アイコン明るさを設定している部分です。
  • Slider 明るさを調整すると、同時にカメアイコン明るさが変わります。
  • .rotation3DEffect(.degrees(180), axis: (x: 0, y: 1, z: 0)):.rotation3DEffect で画像の向きを回転させる事が出来ます。degrees回転角度を設定します。
  • axis は回転軸で、どの方向に回転させるかを指定します。x: 上下y:左右z:奥行です。カメアイコンは、左向きに変更しています。
  • .scaleEffect(opacity):opacity Slider で、カメアイコンの大きさを縮小しています。0 % ← 100 %縮小しますが、0 % → 100 %拡大して元の大きさに戻ります。

 

こちらは、SF Symbols で、thermometer.variable.and.figure のアイコンを表示した

画面です。

 

こちらは、SF Symbols で、tortoise.fill のアイコンを表示した画面です。

 


                VStack {
                    AdjustView(parameterName: "Hue", parameterColor: .cyan, parameterConst: 360.0, parameterUnit: "度", parameter: $hueRatio)

                    AdjustView(parameterName: "Saturation",parameterColor: .indigo, parameterConst: 100.0, parameterUnit: "%", parameter: $saturationRatio)
                    
                    AdjustView(parameterName: "Brightness", parameterColor: .brown, parameterConst: 100.0, parameterUnit: "%", parameter: $brightnessRatio)

                    AdjustView(parameterName: "Opacity", parameterColor: .purple, parameterConst: 100.0, parameterUnit: "%", parameter: $opacity)
                }
                .padding()

  • AdjustView:下記で記載している共通スライダ(View)を呼び出しています。
  • parameterName対象となるスライダ名称を設定しています。
  • parameterColor対象となるスライダ色(Color)を設定しています。
  • parameterConst対象となるスライダ倍率(定数)を設定しています。
  • parameterUnit対象となるスライダ単位を設定しています。
  • parameter対象となるスライダswift内部で保持している値(割合)を設定しています。

AdjustView については、前回の記事で紹介していますので、今回は省略します。

 


                let adjust_color: Color = Color(hue:hueRatio, saturation: saturationRatio, brightness: brightnessRatio, opacity: opacity)

                Text("HEX : #\(adjust_color.hex)")
                    .font(.system(size:20))
                    .foregroundColor(.green)
                    .padding()

  • let adjust_color: Color =:adjust_color(Color:拡張版)へ、スライダで調整した明るさ(情報)代入しています。
  • Text(“HEX : #\(adjust_color.hex)”):ColorExtensions拡張した16進数(HEX)表現を呼び出して、Textで表示しています。

 

アプリ実行:シミュレータ起動

では、実際にアプリを実行してみます。

Xcode の上部タブメニューより、Product → Run を選択するか、command + R

押してみて下さい。

 

エラーが無ければ、iPhoneシミュレータが起動します。

 

ContntVeiw(メインメニュー)に追加した ColorSliderHSBViewボタン

表示されている事が確認出来ました。

 

ColorSliderHSBView:起動画面

では、ColorSliderHSBViewボタン押してみます(タップします)

 

初期値で、温度計(左下)カメ(左向き)アイコン色(HSB)で表示されています。

Hue:252.0 度 / swift:0.70

Saturation:100.0 % / swift:1.00

Brightness:100.0 % / swift:1.00

Opacity:100.0 % / swift:1.00

HEX:#3300FF

 

前回、作成した ColorSliderRGBView(色スライダ調整アプリ)同様に、

ContntVeiw(メインメニュー)の上に ColorSliderHSBView(色スライダ調整アプリ)

重なって、表示された事が確認出来たと思います。

 

ColorSliderHSBView:スライダ調整

では、実際にスライダを移動させて、色(HSB)を調整してみます。

 

スライダを移動させて、温度計(左上)カメ(左向き、縮小)アイコン色(HSB)

薄いピンクで表示されました。

Hue:310.7 度 / swift:0.86

Saturation:74.7 % / swift:0.75

Brightness:88.8 % / swift:0.89

Opacity:58.5 % / swift:0.58

HEX:#E239C4

 

更に、スライダを移動させて、別の色(HSB)を調整してみます。

 

 

スライダを移動させて、温度計(右上)カメ(左向き、縮小)アイコン色(HSB)

薄いレモン色で表示されました。

Hue:58.8 度 / swift:0.16

Saturation:72.2 % / swift:0.72

Brightness:89.0 % / swift:0.89

Opacity:38.8 % / swift:0.39

HEX:#E3E03F

 

まとめ

今回は、SwiftUIで、Slider を利用して、三属性(HSB)明るさを調整する

アプリケーションを開発する記事を紹介しました。

 

次回は、SwiftUIで、NavigationStack を利用して画面遷移を行うアプリケーション

開発する記事を紹介しようと思います。

コメント

タイトルとURLをコピーしました