Olá, já faz algum tempo que uso o mesmo modificador de brilho. Atualizei recentemente para o novo IOS e o modificador de brilho não funciona mais. Certifiquei-me de que nada em meu código fosse depreciado. Não tenho certeza se ele não funciona mais, presumo que seja devido a novas atualizações na forma como o IOS anima as coisas. Eu apreciaria algumas dicas. Obrigado.
import SwiftUI
public struct Shimmer: ViewModifier {
let animation: Animation
@State private var phase: CGFloat = 0
public init(animation: Animation = Self.defaultAnimation) {
self.animation = animation
}
public static let defaultAnimation = Animation.linear(duration: 1.5).repeatForever(autoreverses: false)
public init(duration: Double = 1.5, bounce: Bool = false, delay: Double = 0) {
self.animation = .linear(duration: duration)
.repeatForever(autoreverses: bounce)
.delay(delay)
}
public func body(content: Content) -> some View {
content
.modifier(
AnimatedMask(phase: phase).animation(animation)
)
.onAppear { phase = 0.8 }
}
struct AnimatedMask: AnimatableModifier {
var phase: CGFloat = 0
var animatableData: CGFloat {
get { phase }
set { phase = newValue }
}
func body(content: Content) -> some View {
content
.mask(GradientMask(phase: phase).scaleEffect(4))
}
}
struct GradientMask: View {
let phase: CGFloat
let centerColor = Color.black
let edgeColor = Color.black.opacity(0.3)
@Environment(\.layoutDirection) private var layoutDirection
var body: some View {
let isRightToLeft = layoutDirection == .rightToLeft
LinearGradient(
gradient: Gradient(stops: [
.init(color: edgeColor, location: phase),
.init(color: centerColor, location: phase + 0.1),
.init(color: edgeColor, location: phase + 0.2)
]),
startPoint: isRightToLeft ? .bottomTrailing : .topLeading,
endPoint: isRightToLeft ? .topLeading : .bottomTrailing
)
}
}
}
public extension View {
@ViewBuilder func shimmering(
active: Bool = true, duration: Double = 1.5, bounce: Bool = false, delay: Double = 0
) -> some View {
if active {
self.modifier(Shimmer(duration: duration, bounce: bounce, delay: delay))
} else {
self
}
}
@ViewBuilder func shimmering(active: Bool = true, animation: Animation = Shimmer.defaultAnimation) -> some View {
if active {
self.modifier(Shimmer(animation: animation))
} else {
self
}
}
}
AnimatableModifier
está obsoleto. Isso não precisa doAnimatableMask
. Você pode animar a máscara apenas usando oanimation
modificador que recebe umvalue:
parâmetroDito isto, não sei por que
scaleEffect(3)
ou como a lógica do gradiente para de funcionar.scaleEffect(3)
apenas torna todo o gradiente extremamente grande e você não consegue ver bem a animação. Se você removerscaleEffect
, a animação também não ficará tão boa.Talvez a forma como o gradiente interrompe o trabalho tenha mudado em algum momento.
Presumo que foi daqui que você obteve o código. Olhando para a história desse repositório, o autor mudou da animação de paradas para a animação dos pontos inicial e final do gradiente, o que faz muito mais sentido para mim e, na verdade, parece muito bom.
Aqui está o código: