目標是有一個閃爍的加載影片。像facebook和許多其他應用程式一樣使用。
如果我將它放在 TabView 中,它會按預期作業,但是如果我將代碼放在 NavigationView 中,它會像在視頻中一樣跳來跳去。為什么會發生這種情況?
如果有人可以指導我找到一個很棒的解決方案!
視頻:https : //imgur.com/a/wZ3jI1f
這是代碼:
import SwiftUI
struct ShimmeringListView: View {
public var body: some View {
return VStack {
ShimmeringCell()
ShimmeringCell()
}
}
}
private struct ShimmeringCell: View {
@State private var opacity: Double = Constants.minOpacity
public var body: some View {
cardShimmerAnimation
}
var cardShimmerAnimation: some View {
VStack {
ZStack {
backgroundRectangle
shimmerRectangles
}
}
.padding(.bottom, 20)
.padding(.top, 16)
}
var backgroundRectangle: some View {
Rectangle()
.fill(
LinearGradient(
gradient: Gradient(stops: [
Gradient.Stop(color: .lightGray, location: 0.476),
Gradient.Stop(color: .white, location: 0.524)
]),
startPoint: .top,
endPoint: .bottom))
.frame(height: 269)
.cornerRadius(Constants.cornerRadius)
.padding(.horizontal, 15)
}
var shimmerRectangles: some View {
VStack {
oneRectangle
.frame(height: 28)
.padding(.trailing, 73)
.padding(.bottom, 2)
oneRectangle
.frame(height: 20)
.padding(.trailing, 188)
.padding(.bottom, 2)
oneRectangle
.frame(height: 20)
.padding(.trailing, 130)
.padding(.bottom, 20)
oneRectangle
.frame(height: 20)
.padding(.trailing, 188)
.padding(.vertical, 8)
oneRectangle
.frame(height: 20)
.padding(.trailing, 116)
Divider()
.padding(.horizontal, 32)
.padding(.vertical, 8)
oneRectangle
.frame(height: 20)
.padding(.trailing, 52)
}
}
var oneRectangle: some View {
let baseAnimation = Animation.easeInOut(duration: Constants.duration)
let repeatedAnimation = baseAnimation.repeatForever(autoreverses: true)
return RoundedRectangle(cornerRadius: Constants.cornerRadius)
.fill(Color.loadingColor)
.opacity(opacity)
.transition(.opacity)
.padding(.leading, 31)
.animation(repeatedAnimation)
.onAppear {
self.opacity = Constants.maxOpacity
}
}
}
private struct Constants {
static let duration: Double = 0.9
static let minOpacity: Double = 0.25
static let maxOpacity: Double = 1.0
static let cornerRadius: CGFloat = 6.0
}
uj5u.com熱心網友回復:
您只需要兩個小的更改(請參閱代碼中行內的注釋):
return RoundedRectangle(cornerRadius: Constants.cornerRadius)
.fill(Color.loadingColor)
.opacity(opacity)
.transition(.opacity)
.padding(.leading, 31)
.animation(repeatedAnimation, value: opacity) //<-- Add value: parameter
.onAppear {
DispatchQueue.main.async { //<-- wrap in DispatchQueue.main.async
self.opacity = Constants.maxOpacity
}
}
就原因而言:對于animation修飾符,animation不value推薦使用不帶引數的 ,我們應該期望使用value:. 對于DispatchQueue,我最好的猜測是NavigationView附加了一個隱式影片,我們需要在下一個運行回圈中啟動這個影片以確保它是獨立的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/347601.html
