【问题标题】:Can't drag down/dismiss UIColorPickerViewController无法向下拖动/关闭 UIColorPickerViewController
【发布时间】:2022-08-10 01:03:41
【问题描述】:
我使用 sheet() 方法将 UIColorPickerViewController 显示为工作表,一切正常,但我不能再向下拖动/关闭视图。
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()
}
知道如何使拖动/向下关闭手势起作用吗?
谢谢!
标签:
swiftui
uiviewcontrollerrepresentable
uicolorpickerviewcontroller
【解决方案1】:
在尝试构建类似于上面的颜色选择器时遇到了同样的问题。起作用的是使用“关闭”按钮将颜色选择器“包装”在视图中。并且还发现视图顶部的栏将允许选择器现在被向下拖走。下面是我的包装。 (可以向栏添加更多功能,例如标题。)
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)
}
}
}
为了完整起见,这是我的颜色选择器版本:
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()
}
}
}