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

如何创建一个SwiftUI按钮,在触摸时更改不透明度并触发按钮动作?,swiftui,Swiftui,我想创建一个带有快捷界面的按钮,当我的手指触到它的时候就会触发(就像UIKit的触地而不是内部触地)。我还希望当我的手指按下按钮时,按钮的不透明度变为0.7。我希望只有当我的手指不再触摸按钮时,按钮的不透明度才会变回1 我尝试了两种不同类型的按钮样式来创建这样的按钮,但都失败了: struct ContentView: View { var body: some View { Button(action: {

我想创建一个带有快捷界面的按钮,当我的手指触到它的时候就会触发(就像UIKit的触地而不是内部触地)。我还希望当我的手指按下按钮时,按钮的不透明度变为0.7。我希望只有当我的手指不再触摸按钮时,按钮的不透明度才会变回1

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

    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)


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

我没有使用
按钮样式,但尝试使用解决方法。我编写
点击手势
长按手势
并玩
@GestureState
来控制“按钮”(即
文本
)的
.opacity
)。结果正如你所问:

struct composingsignities:View{
塔潘德隆普酒店{
案例无效
压箱
变量显示:Bool{
返回自我==。按
}
}
@GestureState变量GestureState=TapAndLongPress.inactive
@国家私有变量didPress=false
var body:一些观点{

点击并长按手势=长按手势(最短持续时间:2)//如果minimumDurationOk,我知道作者只想通过
按钮查看解决方案,所以我进一步挖掘了一下。从中发现了一些有趣的东西。想法与:使用
@GestureState
并创建
长按手势
,其中
。更新($…)
此状态。但在
PrimitiveButtonStyle
中,您不需要一起编写一些手势。因此,我对代码进行了一些简化,并在模拟器上进行了测试。我认为现在这正是作者需要的:

struct composingsignities:View{
var body:一些观点{
按钮(操作:{
打印(“动作触发”)
}){
文本(“按钮”)
.padding()
}
.buttonStyle(MyPrimitiveButtonStyle())
}
}
结构MyPrimitiveButtonStyle:PrimitiveButtonStyle{
func makeBody(配置:PrimitiveButtonStyle.configuration)->一些视图{
MyButton(配置:配置)
}
结构MyButton:视图{
@GestureState private var pressed=false
let配置:PrimitiveButtonStyle.configuration
让颜色:颜色=.green
@国家私有var=false
var body:一些观点{
//您可以将minimumDuration设置为Double.greatestfinitemagnity,如果您认为
//用户可以长时间按住按钮
让长按=长按手势(最小持续时间:300,最大距离:300.0)
.正在更新($pressed){value,state,uu中
状态=值
self.configuration.trigger()
}
返回配置标签
.背景(颜色.绿色)
.不透明度(按0.5:1.0)
.手势(长按)
}
}
}

在XCode中运行了此操作,但它显示“在视图更新期间修改状态,这将导致未定义的行为”。当我按“Hello world!”时,我也看不到“action was fired”文本标签。如果按“Hello world”足够长的时间,当手指仍然按下按钮时,它的不透明度实际上回到1。@SmoothPoop69什么版本的Xcode?一些新的东西,你是在画布上还是在真实的设备上尝试过它?@SmoothPoop69我试着在模拟器中运行,遇到了同样的问题。检查编辑后的更新回答:现在它可以工作了。嘿,非常感谢你的更新。我真的很感激它。它不再显示紫色错误。但是我想知道是否可以使用一个实际的按钮而不是使用文本标签作为按钮。我想在点击按钮时触发一个方法,为了简单起见,一个简单的打印方法就可以了。我想知道现在是否可以使用SwiftUI