ios - SwiftUI:自定义按钮无法识别具有清晰背景和 buttonStyle 的触摸

标签 ios swift swiftui xcode11

我偶然发现了 Button 的奇怪行为SwiftUI 中的 s 结合自定义 ButtonStyle .

我的目标是创建一个自定义 ButtonStyle带有某种“后推动画”。我为此使用了以下设置:

struct CustomButton<Content: View>: View {
    private let content: () -> Content

    init(content: @escaping () -> Content) {
        self.content = content
    }

    var body: some View {
        VStack {
            Button(action: { ... }) {
                content()
            }
            .buttonStyle(PushBackButtonStyle(pushBackScale: 0.9))
        }
    }
}

private struct PushBackButtonStyle: ButtonStyle {
    let pushBackScale: CGFloat

    func makeBody(configuration: Self.Configuration) -> some View {
        configuration
            .label
            .scaleEffect(configuration.isPressed ? pushBackScale : 1.0)
    }
}

// Preview
struct Playground_Previews: PreviewProvider {
    static var previews: some View {
        CustomButton {
            VStack(spacing: 10) {
                HStack {
                    Text("Button Text").background(Color.orange)
                }

                Divider()

                HStack {
                    Text("Detail Text").background(Color.orange)
                }
            }
        }
        .background(Color.red)
    }
}

当我现在尝试在 Text 之外触摸此按钮时看,什么都不会发生。没有动画可见,也不会调用 Action block 。

showcase

到目前为止我发现了什么:
  • 当您删除 .buttonStyle(...)它确实按预期工作(当然没有自定义动画)
  • 或者当您设置 .background(Color.red))VStackCustomButton.buttonStyle(...) 结合使用时,它也能按预期工作。

  • 现在的问题是,是否有人对如何正确解决此问题或如何解决此问题有更好的了解?

    最佳答案

    只需在您的自定义按钮样式中添加 HitTest 内容形状,如下所示

    使用 Xcode 11.4/iOS 13.4 测试

    demo

    private struct PushBackButtonStyle: ButtonStyle {
        let pushBackScale: CGFloat
    
        func makeBody(configuration: Self.Configuration) -> some View {
            configuration
                .label
                .contentShape(Rectangle())     // << fix !!
                .scaleEffect(configuration.isPressed ? pushBackScale : 1.0)
        }
    }
    

    关于ios - SwiftUI:自定义按钮无法识别具有清晰背景和 buttonStyle 的触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61352171/

    相关文章:

    ios - 在 Facebook 上分享,手机上不显示文字。 ( swift )

    objective-c - UIView animation block : if duration is 0, 和没有动画一样吗?

    ios - 在 Swift 中按下特定的键盘按钮

    Swift2 UI 测试 - 等待元素出现

    ios - Swift 中的 CorePlot 无法调用 “numberForPlot”

    swift - 参数类型不符合预期类型 'WKScriptMessageHandler'

    view - SwiftUI 问题将变量传递给另一个 View

    ios - SwiftUI - 如何防止工作表中的键盘推高我的主 UI

    MVC 架构中的 iOS Singleton 类

    ios - Microchip RN4020 -> MLDP模式iOS示例代码