按下按钮时激活颜色选择器叠加 SwiftUI

Wis*_*Eye 3 swiftui

在 SwiftUI 中,由于视图,我们很幸运拥有一个原生颜色选择器ColorPicker()。不幸的是,它的工作方式是视图覆盖在它所放入的框架内......我可以处理这个问题,这不是问题。我无法修复的是通过按钮激活视图并摆脱默认的圆形按钮。

我想要完成的事情,如图所示:

按下按钮...

在此输入图像描述

获取颜色选择器覆盖... 在此输入图像描述

Asp*_*eri 6

好吧,没有直接的 SwiftUI 公共 API,所以

免责声明:以下内容仅用于演示目的,如果您将其用于实际项目中,所有后果均由您承担!

在 iOS 15-16 上测试有效!

演示

现在很明显,这种方法一半是hacky,一半是因为没有使用私有API,但是-hacky是因为我们对运行时进行了逆向工程。

让我们开始吧... ColorPickeris 只是 的包装器UIColorWell,即UIControl,但它不执行任何控制操作,它只是一个容器,UIButton里面有一个容器。因此,我们只需要找到该按钮并在需要时激活其操作,同时隐藏丑陋的东西。 ColorPicker

主要部分:

extension UIColorWell {
    override open func didMoveToSuperview() {
        // ...

        // find a button and store handler with it in helper
        if let uiButton = self.subviews.first?.subviews.last as? UIButton {
            UIColorWellHelper.helper.execute = {
                uiButton.sendActions(for: .touchUpInside)
Run Code Online (Sandbox Code Playgroud)

和用途

Button {
    // call action in helper 
    UIColorWellHelper.helper.execute?()    // << here !!
} label: {
    Text("Show Color Picker")
}
.buttonStyle(.borderedProminent)
.background(
    // hide standard picker in background
    ColorPicker("", selection: $color, supportsOpacity: false)
        .labelsHidden().opacity(0)
)
Run Code Online (Sandbox Code Playgroud)

测试模块在这里