iOS 17.1中UIColorPickerViewController无关闭按钮问题求助
iOS 17.1 中 UIColorPickerViewController 无关闭按钮的解决方案
针对iOS 17.1系统中UIColorPickerViewController使用.overFullScreen模态样式时缺失关闭按钮的问题,提供以下几种可行解决方案:
方案一:调整模态展示样式
将模态展示样式从.overFullScreen替换为.automatic或.pageSheet,系统会自动保留颜色选择器的原生导航栏(包含关闭按钮):
let vc = UIColorPickerViewController() vc.delegate = self // 使用自动适配或页表样式 vc.modalPresentationStyle = .automatic // 也可选择 .pageSheet if let selectedColor = selectedColor { vc.selectedColor = selectedColor } present(vc, animated: true, completion: nil)
.automatic会根据系统版本和上下文自动选择最优展示样式,在iOS 17.1中能完美适配原生颜色选择器的交互逻辑。
方案二:手动添加关闭按钮(保留.overFullScreen样式)
若必须使用.overFullScreen样式,可手动为颜色选择器添加导航栏和关闭按钮,同时调整内部视图位置避免遮挡:
let vc = UIColorPickerViewController() vc.delegate = self vc.modalPresentationStyle = .overFullScreen // 创建自定义导航栏 let navBarHeight: CGFloat = 44 let navBar = UINavigationBar(frame: CGRect( x: 0, y: view.safeAreaInsets.top, width: view.bounds.width, height: navBarHeight )) let navItem = UINavigationItem(title: "选择颜色") let closeButton = UIBarButtonItem(barButtonSystemItem: .close, target: self, action: #selector(dismissColorPicker)) navItem.rightBarButtonItem = closeButton navBar.setItems([navItem], animated: false) vc.view.addSubview(navBar) // 调整颜色选择器内部视图位置,避免被导航栏遮挡 if let contentView = vc.view.subviews.first { contentView.frame.origin.y = navBarHeight + view.safeAreaInsets.top } if let selectedColor = selectedColor { vc.selectedColor = selectedColor } present(vc, animated: true, completion: nil) // 关闭按钮触发方法 @objc private func dismissColorPicker() { dismiss(animated: true, completion: nil) }
方案三:利用代理方法自动关闭
实现UIColorPickerViewControllerDelegate的相关方法,在用户完成颜色选择后自动关闭选择器:
extension YourViewController: UIColorPickerViewControllerDelegate { func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) { // 用户完成选择后自动关闭 dismiss(animated: true, completion: nil) } func colorPickerViewControllerDidSelectColor(_ viewController: UIColorPickerViewController) { // 处理颜色选择逻辑 selectedColor = viewController.selectedColor } }
此方法可作为补充,确保用户即使没有关闭按钮,也能通过完成选择操作退出颜色选择器。
内容的提问来源于stack exchange,提问作者Erhan Demirci
相关产品推荐
相关产品推荐

