user2802154
user2802154

Reputation: 76

Can't drag down/dismiss UIColorPickerViewController

I am displaying a UIColorPickerViewController as a sheet using the sheet() method, everything works fine but I can't drag down/dismiss the view anymore.

import Foundation
import SwiftUI

struct ColorPickerView: UIViewControllerRepresentable {
    private var selectedColor: UIColor!
    
    init(selectedColor: UIColor) {
        self.selectedColor = selectedColor
    }
    
    func makeUIViewController(context: Context) -> UIColorPickerViewController {
        let colorPicker = UIColorPickerViewController()
        colorPicker.selectedColor = self.selectedColor
        
        return colorPicker
    }
    
    func updateUIViewController(_ uiViewController: UIColorPickerViewController, context: Context) {
        // Silent
    }
}
.sheet(isPresented: self.$viewManager.showSheet, onDismiss: {
    ColorPickerView()
}

Any idea how to make the drag/down dismiss gesture works?

Thanks!

Upvotes: 1

Views: 488

Answers (1)

anorskdev
anorskdev

Reputation: 1925

Ran into the same problem when trying to build a color picker similar to above. What worked was "wrapping" the color picker in a view with a Dismiss button. And also discovered that the bar at the top of the view would allow the picker to now be dragged down and away. Below is my wrapper. (One could add more features such as a title to the bar.)

struct ColorWrapper: View {
    var inputColor: UIColor
    @Binding var isShowingColorPicker: Bool
    @Binding var selectedColor: UIColor?

    var body: some View {
        VStack {
            HStack {
                Spacer()
                Button("Dismiss", action: {
                    isShowingColorPicker = false
                }).padding()
            }
            ColorPickerView(inputColor: inputColor, selectedColor: $selectedColor)
        }
    }
}

And for completeness, here is my version of the color picker:

import SwiftUI

struct ColorPickerView: UIViewControllerRepresentable {
    typealias UIViewControllerType = UIColorPickerViewController

    var inputColor: UIColor

    @Binding var selectedColor: UIColor?

    @Environment(\.presentationMode) var isPresented

    func makeUIViewController(context: Context) -> UIColorPickerViewController {
        let picker = UIColorPickerViewController()
        picker.delegate = context.coordinator
        picker.supportsAlpha = false
        picker.selectedColor = inputColor
        return picker
    }

    func updateUIViewController(_ uiViewController: UIColorPickerViewController, context: Context) {
        uiViewController.supportsAlpha = false
    }

    func makeCoordinator() -> Coordinator {
        return Coordinator(parent: self)
    }

    class Coordinator: NSObject, UINavigationControllerDelegate, UIColorPickerViewControllerDelegate {
        var parent: ColorPickerView

        init(parent: ColorPickerView) {
            self.parent = parent
        }

        func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) {
            parent.isPresented.wrappedValue.dismiss()
        }

        func colorPickerViewController(_ viewController: UIColorPickerViewController, didSelect color: UIColor, continuously: Bool) {
            parent.selectedColor = color
            // parent.isPresented.wrappedValue.dismiss()
        }
    }

}

Upvotes: 2

Related Questions