一、背景
- 参考了两位大神:
- 当前时间:2022年2月5日
- 有可能因为版本更替,两位大神的toast都不是很好用,一位有布局问题,一位有动画问题,因此,经过对两位大佬代码的学习,改出了当前时间点比较好用的Toast代码
二、代码
-
使用方法:
import SwiftUI struct ContentView: View { @State var showToast = false var body: some View { Button(action: { self.showToast.toggle() }, label: { Text("Button") }) .toast(isShow: $showToast, info: "请求成功") } }
该Toast会在其所在的View上居中展示,请妥善选择Toast所在的View
-
Toast源码:
import SwiftUI struct TWToastView: View { @Binding var isShow: Bool let info: String @State private var isShowAnimation: Bool = true @State private var duration : Double init(isShow:Binding<Bool>,info: String = "", duration:Double = 1.0) { self._isShow = isShow self.info = info self.duration = duration } var body: some View { ZStack { Text(info) .font(Font.title3) .foregroundColor(.white) .frame(minWidth: 80, alignment: Alignment.center) .zIndex(1.0) .padding() .background( RoundedRectangle(cornerRadius: 12) .foregroundColor(.black) .opacity(0.6) ) } .onAppear() { DispatchQueue.main.asyncAfter(deadline: .now() + duration) { isShowAnimation = false } } .padding() .opacity(isShowAnimation ? 1 : 0) .animation(.easeIn(duration: 0.8)) .edgesIgnoringSafeArea(.all) .onChange(of: isShowAnimation) { e in DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) { self.isShow = false } } } } extension View { func toast(isShow:Binding<Bool>, info:String = "", duration:Double = 1.0) -> some View { ZStack { self if isShow.wrappedValue { TWToastView(isShow:isShow, info: info, duration: duration) } } } }
可根据实际需要进行自定义修改