基本的にColorPickerのイニシャライザはビューに配置して使うものだから警告が出ているのかなと思います。
ビューに配置するとしたら次のような感じになるかなと思います。
swift
1import SwiftUI
2struct ContentView: View {
3 @State private var color = Color.yellow
4 var body: some View {
5 VStack(spacing: 100) {
6 ZStack {
7 Rectangle()
8 .foregroundColor(color)
9 .frame(width: 100, height: 100)
10 ColorPicker("", selection: $color)
11 .frame(width: 100, height: 100)
12 .labelsHidden()
13// .opacity(0) // 透明にするとタップできない・・
14 }
15 }
16 }
17}
でも、ColorPickerを透明にするとタップできなかったり、
タップ対象のマルの形を変えることができなかったり、
ちょっと不都合そうでした。
*私が知識不足だからかもしれません・・
*ColorPickerのタップした時の動きをプログラムから実現できるかな?と思ったのですが、ちょっとわかりませんでした・・
次の記事を参考にして、
UIKitのUIColorPickerViewControllerを使う形で実装してみました。
細かい動きがColorPickerに寄せられていませんが・・
https://www.hackingwithswift.com/books/ios-swiftui/wrapping-a-uiviewcontroller-in-a-swiftui-view
https://www.hackingwithswift.com/books/ios-swiftui/using-coordinators-to-manage-swiftui-view-controllers
swift
1import SwiftUI
2
3struct ContentView: View {
4 @State private var color = Color.yellow
5 @State private var isPresented = false
6 var body: some View {
7 VStack(spacing: 100) {
8 ZStack {
9 Rectangle()
10 .foregroundColor(color)
11 .frame(width: 100, height: 100)
12 .onTapGesture {
13 isPresented = true
14 }
15 }
16 .sheet(isPresented: $isPresented) {
17 ColorPickerViewController(color: $color)
18 }
19 }
20 }
21}
22
23struct ColorPickerViewController: UIViewControllerRepresentable {
24 @Binding var color: Color
25 func makeUIViewController(context: Context) -> some UIViewController {
26 let colorPickerViewController = UIColorPickerViewController()
27 colorPickerViewController.delegate = context.coordinator
28 colorPickerViewController.selectedColor = UIColor(color)
29 return colorPickerViewController
30 }
31 func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {
32 }
33 func makeCoordinator() -> Coordinator {
34 Coordinator(self)
35 }
36 class Coordinator: NSObject, UIColorPickerViewControllerDelegate {
37 var parent: ColorPickerViewController
38 init(_ parent: ColorPickerViewController) {
39 self.parent = parent
40 }
41 func colorPickerViewController(_ viewController: UIColorPickerViewController, didSelect color: UIColor, continuously: Bool) {
42 parent.color = Color(color)
43 viewController.dismiss(animated: true)
44 }
45 }
46}
こちらをベースに進める感じで、、参考になりますでしょうか・?
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2023/05/22 13:56