SwiftUI:Toggle詳解

1.自定義樣式

使用:

Toggle(isOn: $userData.showFavoritesOnly) {
   Text("Show Favorites Only")
}
.toggleStyle(MyToggleStyle())

ToggleStyle,可以根據(jù)該模板定制

struct MyToggleStyle:ToggleStyle {
    let width: CGFloat = 50
    let height:CGFloat = 30
    var onColor:Color  = .green
    var offColor:Color = .init(UIColor.systemGray5)
    var isAnimation = true

    func makeBody(configuration: Configuration) -> some View {
        HStack {
            configuration.label
            Spacer()
            ZStack(alignment: configuration.isOn ? .trailing : .leading) {
                Spacer()
                RoundedRectangle(cornerRadius: width/2.0)
                    .frame(width: width, height: height)
                    .foregroundColor(configuration.isOn ? onColor : offColor)

                RoundedRectangle(cornerRadius: (height-4)/2.0)
                    .frame(width: height-4 , height: height-4)
                    .padding(2)
                    .foregroundColor(.white)
                    .animation(isAnimation ? .easeIn(duration: 0.15) : nil)
                    .onTapGesture {
                        configuration.$isOn.wrappedValue.toggle()
                    }
            }
        }
    }
}

條件判斷是否能點(diǎn)擊Toggle

@State var tmpState:Bool = false //臨時(shí)狀態(tài)

Toggle(isOn:$tmpState) {
    Text("Click check..")
}
.onTapGesture {
    print("inOn:\(tmpState) 檢查是否符合條件,如果不符合就還原狀態(tài)")
    DispatchQueue.global().asyncAfter(deadline: DispatchTime.now()+0.3) {
        print("還原狀態(tài)")
        withAnimation(Animation.easeIn(duration: 0.15)){
            tmpState.toggle()
        }
    }
}
2.使用自定義樣式后,為Toggle添加onTapGesture無效的解決方法

由于SwiftUI的Gesture事件是先由子控件觸發(fā),所以可以使用simultaneousGesture ()修飾符告訴SwiftUI您希望父手勢和子手勢同時(shí)觸發(fā),如:

//替換原來得.onTapGesture
Toggle(isOn:$tmpState) {
    Text("Click check..")
}
.toggleStyle(MyToggleStyle())//自定義樣式中使用了onTapGesture,所以需要.simultaneousGesture
.simultaneousGesture(
    TapGesture()
        .onEnded{
            print("inOn:\(tmpState) 檢查是否符合條件,如果不符合就還原狀態(tài)")
            DispatchQueue.global().asyncAfter(deadline: DispatchTime.now()+0.3) {
                print("還原狀態(tài)")
                withAnimation(Animation.easeIn(duration: 0.15)){
                    tmpState.toggle()
                }
            }
        }
)
//.simultaneousGesture可以使用多個(gè),如果有多個(gè).simultaneousGesture,則先執(zhí)行后添加的.simultaneousGesture
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 引言 該插件的兩個(gè)主要作用: 為html文件中引入的外部資源如script、link動(dòng)態(tài)添加每次compile后的...
    忍不住的k閱讀 741評論 0 0
  • 自2017年初開始,我就致力于Android應(yīng)用框架的研究,到2018年開始在Github上陸續(xù)開源系列作品,再到...
    xuexiangjys閱讀 928評論 1 10
  • 引言 最近在react項(xiàng)目中初次用到了html-webapck-plugin插件,用到該插件的兩個(gè)主要作用: 為h...
    三省吾身_9862閱讀 784評論 0 2
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,889評論 28 54
  • 信任包括信任自己和信任他人 很多時(shí)候,很多事情,失敗、遺憾、錯(cuò)過,源于不自信,不信任他人 覺得自己做不成,別人做不...
    吳氵晃閱讀 6,391評論 4 8

友情鏈接更多精彩內(nèi)容