如何创建一个SwiftUI按钮来改变不透明度并在触摸时触发按钮动作?

SmoothPoop69

我想用SwiftUI创建一个按钮,该按钮在我的手指触摸到该按钮时立即触发(例如UIKit的触摸而不是内部的触摸)。我还希望当手指按下按钮时按钮的不透明度变为0.7。我希望仅当我的手指不再触摸按钮时,按钮的不透明度才变回1。

我尝试了2种不同类型的按钮样式来创建这样的按钮,但是它们都失败了:

    struct ContentView: View {  
        var body: some View {  
            Button(action: {  
                print("action triggered")  
            }){  
                Text("Button").padding()  
            }  
                .buttonStyle(SomeButtonStyle())  
        }  
    }  

    struct SomeButtonStyle: ButtonStyle {  
        func makeBody(configuration: Self.Configuration) -> some View {  
            configuration.label  
                .background(Color.green)  
                .opacity(configuration.isPressed ? 0.7 : 1)  
                .onLongPressGesture(  
                    minimumDuration: 0,  
                    perform: configuration.trigger//Value of type 'SomeButtonStyle.Configuration' (aka 'ButtonStyleConfiguration') has no member 'trigger'  
                )  
        }  
    }  

    struct SomePrimativeButtonStyle: PrimitiveButtonStyle {  
        func makeBody(configuration: Configuration) -> some View {  
          configuration.label  
            .background(Color.green)  
            .opacity(configuration.isPressed ? 0.7 : 1)//Value of type 'SomePrimativeButtonStyle.Configuration' (aka 'PrimitiveButtonStyleConfiguration') has no member 'isPressed'  
            .onLongPressGesture(  
              minimumDuration: 0,  
              perform: configuration.trigger  
            )  
        }  
    }

显然,以上所有按钮样式均无效,因为ButtonStyle和PrimitiveButtonStyle不共享相同的方法和属性,因此我不能在同一环境中同时使用isPressed属性(属于ButtonStyle)和Trigger方法(属于PrimitiveButtonStyle)按钮样式。

我应该如何配置我的按钮样式以使其工作?

亚历山大·格拉波夫斯基

好的,我知道作者只希望使用来查看解决方案Button,所以我要多讲一点。Swift UI Lab上发现了一些有趣的东西我们的想法是一样的在我的第一个答案:使用@GestureState和创建LongPressGesture.updating($...)这种状态。但是,PrimitiveButtonStyle您无需一起构成几个手势。因此,我稍微简化了代码并在模拟器上进行了测试。我认为现在正是作者需要的:

struct ComposingGestures: View {

    var body: some View {

        Button(action: {
            print("action triggered")
        }){
            Text("Button")
                .padding()
        }
            .buttonStyle(MyPrimitiveButtonStyle())

    }

}

struct MyPrimitiveButtonStyle: PrimitiveButtonStyle {

    func makeBody(configuration: PrimitiveButtonStyle.Configuration) -> some View {
        MyButton(configuration: configuration)
    }

    struct MyButton: View {
        @GestureState private var pressed = false

        let configuration: PrimitiveButtonStyle.Configuration
        let color: Color = .green

        @State private var didTriggered = false

        var body: some View {
            // you can set minimumDuration to Double.greatestFiniteMagnitude if you think that
            // user can hold button for such a long time
            let longPress = LongPressGesture(minimumDuration: 300, maximumDistance: 300.0)
                .updating($pressed) { value, state, _ in
                    state = value
                    self.configuration.trigger()
            }

            return configuration.label
                .background(Color.green)
                .opacity(pressed ? 0.5 : 1.0)
                .gesture(longPress)
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当按下另一种可触摸的不透明度时,不会按下一个可触摸的不透明度

我如何获得一个按钮来使用HTML,JS和CSS更改对象的不透明度

如何在不透明度增加的情况下翻译按钮单击时的 div?

如何在单击“显示更多”按钮时消除背景的不透明度

单击按钮时如何更改容器的不透明度?

如何创建一个简单的布局,如具有背景和不透明度的 TextBlock?

调整 UIView 内按钮的不透明度,不透明度为 0.5

更改未单击的按钮的按钮不透明度

按下时不会触发可触摸的不透明度

更改一个div的不透明度,并在将鼠标悬停在另一个div上时进行过渡

如何做一个缓慢的CSS过渡到不透明度= 1,和快速/直接过渡到不透明度= 0?

如何转换不透明度以显示另一个 div?

如何随着时间改变背景不透明度?

如何改变儿童的不透明度

移动对象并更改按钮onClick的不透明度

按钮不透明度不适用

按钮不透明度/alpha 设置

我创建了用于闪烁效果和不透明度的按钮。当我单击按钮时,不透明度有效但闪烁效果无效

如何检查列表中的两个按钮是否具有相同的不透明度?

未选中复选框时向按钮图像添加不透明度的Javascript

(JavaScript 和 HTML)单击时更改按钮的不透明度

SwiftUI-如何脉动图像不透明度?

如何通过单击按钮更改彩色框的不透明度?

如何:单选按钮更改图像的不透明度

如何通过按下按钮使不透明度停止褪色?

如何单独更改按钮pygame上文本的不透明度?

React:如何通过单击按钮更改元素的不透明度?

如何为图像创建不透明度

聚焦时如何更改JPanel的不透明度?