嘗試使用 SwiftUI 影片,這對我的舊灰質造成了負擔。對于兩個非常相似的代碼變體,我得到了不同的結果,但不知道為什么。
示例:下面生成三個影像的垂直堆疊。
@State private var rotationAmount = 0.0
VStack{
ForEach(0..<3) { number in
Button {
rotationAmount = 360
//execute main functionality
} label: {
MyImage(number)
.rotationEffect(.degrees(rotationAmount), anchor: .center)
}
}
}
當單擊其中一個影像(即按鈕)時,其影像在其 Z 軸上旋轉 360 度
但是,如果更改按鈕操作代碼以使其使用withAnimation塊,則行為會有所不同:
Button{
withAnimation {
rotationAmount = 360
}
//execute main functionality
} label: {
MyImage(number)
.rotationEffect(.degrees(rotationAmount), anchor: .center)
}
通過這種變化,單擊任何影像都會導致它們三個都旋轉。
在這兩種情況下,每個按鈕都有一個系結到rotationAmount屬性的影片,所以我不明白這兩個示例之間的行為差??異。如果有的話,我希望所有三個影像在這兩種情況下都會旋轉,因為它們都系結到相同的變異屬性。
uj5u.com熱心網友回復:
每次rotationAmount更改都會導致ContentView重新評估 s 身體。由于每次都360被添加rotationAmount,我們不會期望在沒有影片時會有任何可見的變化,因為視圖會旋轉到它所在的確切位置。
要看到這一點,您可以用 替換.rotationEffect(.degrees(rotationAmount), anchor: .center),.font(rotationAmount == 0.0 ? .body : .largeTitle)這將向您顯示所有視圖都已更新,只有一些沒有影片。
Button {
rotationAmount = 360
} label: {
MyImage(number)
.font(rotationAmount == 0.0 ? .body : .largeTitle)
}
被點擊時的行為Button是導致一張影像隨著影片旋轉而沒有明確告訴它這樣做的原因。由于按鈕的高亮狀態會導致按鈕標簽的影片更改,因此影片也會應用于同時發生在按鈕上的其他更改。
要查看它是由影像在按鈕標簽中引起的,您可以使用.onTapGesture它來查看當它不在按鈕標簽中時它不會更新:
MyImage(number)
.rotationEffect(.degrees(rotationAmount), anchor: .center)
.onTapGesture {
rotationAmount = 360
}
也可以看出是按鈕標簽同時發生了其他影片造成的,下面的代碼會rotationEffect在按鈕高亮狀態影片完成后發生變化,導致屬性變化時圖片不影片:
Button {
DispatchQueue.main.asyncAfter(deadline: .now() 1, execute: {
rotationAmount = 360
})
} label: {
MyImage(number)
.rotationEffect(.degrees(rotationAmount), anchor: .center)
}
這是一個示例,顯示使用withAnimation更新一個屬性而不將另一個屬性更改放在其中withAnimation將導致在withAnimation點擊按鈕時僅塊中的屬性影片:
Button {
rotationAmount = 360
withAnimation {
myColorEnabled.toggle() // @State var myColorEnabled = false
}
} label: {
Text("Test")
.rotationEffect(.degrees(rotationAmount), anchor: .center)
Text("Hello")
.foregroundColor(myColorEnabled ? .red : .gray)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/532871.html
標籤:迅速动画迅捷
上一篇:每次點擊影片如何播放?
下一篇:css影片在瀏覽器中不同
