この前 UIColorPickerViewController を使ってアプリ内のオブジェクトの色を変更する仕様に遭遇しました。
使ったことなかったのでワクワクしながら実装したのですが、いざ使ってみると「…」って感じの部分もあったので、サクッと使い方も振り返りつつ、これからアプリ内のカラー変更等で実装しようとしてる方の参考になればと思います。
開発環境(前提条件)
・Xcode14(2022年11月10日再確認済み)
・Swift5
使い方
機能自体もシンプルなので、使い方もシンプルです。最低3行で表示することが出来ます。
class ViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
let pickerVC = UIColorPickerViewController()
pickerVC.delegate = self
pickerVC.supportsAlpha = true // 透過の許可
pickerVC.selectedColor = .black // 初期のカラー
self.present(pickerVC,
animated: true)
}
}
//MARK: - UIColorPickerViewControllerDelegate
extension ViewController: UIColorPickerViewControllerDelegate {
// 色を変更するたびに呼ばれる
func colorPickerViewController(_ viewController: UIColorPickerViewController, didSelect color: UIColor, continuously: Bool) {
guard !continuously else {
return
}
// ここは変更が終わったとき(指を離したとき)に通る
}
// UIColorPickerViewControllerが閉じた時に呼ばれる
func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) {
}
}
コードもシンプルで使いやすい印象ですが、個人的にはちょっと仕様が好きじゃなかったです。
開発者が優しさを与える必要あり
仕様がちょっと不思議で、キャンセルができません。
スペクトラムやスライダで色を変更すると、colorPickerViewController(_:didSelect:continuously:) が連続でバッコバコ呼ばれるのですが、少しでも変更した時点で呼ばれてしまいます。
これ実装して流れで使うと分かるのですが、ユーザーが「やっぱり変更しないでおこう」と思って指を離しても、色が反映されている状態となり、まぁまぁ優しくない仕様になります。
ちなみに、スペクトラムやスライダはこんなやつらです。

しかも画面を閉じた時に呼ばれる colorPickerViewControllerDidFinish(_:) も、キャンセルボタンを押して画面を閉じても呼ばれてしまいますし、下に引っ張って画面を閉じても呼ばれてしまいます…。
ユーザーとしてはキャンセルしたつもりでも色が反映され、しかも前の色を保持していなかったら元に戻せないので、開発者が優しさという名の追加仕様を与えてやる必要があります。
マジでむむむぐぬぬです (; ・`д・´)
UIPickerViewController に完了ボタンがあればいいだけの話なんすけどね。笑
まぁないものはないので、開発側でどうにかカバーするしかないです。
さいごに
サクッと使えるのはいいんですけど、挙動とか UI が使いづらい印象です。
でも自分で UIPickerViewController の機能を実装するのは大変なんで、ありがたく使わせてもらいます。笑



コメント