在 Xcode 11.3.1 和 11.4 上测试:
将隐式动画附加到过渡时,某些过渡类型似乎已损坏。具体来说,任何与位置相关的转换都不会应用给定的隐式动画。.slide, .move,.offset坏了。.opacity而.scale似乎确定。(详见附件)
显式动画似乎在所有情况下都能正常工作。
即使使用自定义复合过渡,与位置相关的子过渡也不会响应隐式动画。
这是一个错误,还是预期的行为?
如果您想根据隐式属性更改为特定 UI 元素触发多个不同的动画曲线,这似乎是一个问题。
struct MyExample: View {
@State private var isShowing = true
private let myAnimation = Animation.spring(response: 0.8, dampingFraction: 0.2, blendDuration: 3.0)
var body: some View {
VStack(spacing:20) {
if self.isShowing {
Text("Opacity").modifier(MyBigFont())
.transition(AnyTransition.opacity.animation(myAnimation))
Text("Scale").modifier(MyBigFont())
.transition(AnyTransition.scale.animation(myAnimation))
Text("Slide").modifier(MyBigFont())
.transition(AnyTransition.slide.animation(myAnimation))
Text("Move").modifier(MyBigFont())
.transition(AnyTransition.move(edge: .trailing).animation(myAnimation))
Text("Offset").modifier(MyBigFont())
.transition(AnyTransition.offset(x: 20, y: 0).animation(myAnimation))
Text("Custom").modifier(MyBigFont())
.transition(AnyTransition.myCustomTransition.animation(myAnimation))
}
Spacer()
Button(action: {
self.isShowing.toggle()
}) {
Text("Implicit Toggle")
}
Button(action: …Run Code Online (Sandbox Code Playgroud) 尝试在 SwiftUI 中实现以下动画,发现几乎不可能:
总结一下效果:重复脉冲,以交错延迟来动画每个片段。对于每个段:
此外,每个“脉冲”之间存在延迟。
我使用 SwiftUI 能够达到的最接近效果是使用.repeatForever修改器连续重复的动画。(下面的代码。暂时忽略时间上的不匹配。)
如何在动画的每个循环之间添加延迟?
这是我的代码的结果如下:
import SwiftUI
struct ArrowShape : Shape {
func path(in rect: CGRect) -> Path {
var path = Path()
path.move(to: CGPoint(x: 0, y: 0))
path.addLine(to: CGPoint(x: rect.size.width, y: rect.size.height/2.0))
path.addLine(to: CGPoint(x: 0, y: rect.size.height))
return path
}
}
struct Arrows: View {
private let arrowCount = 3
@State var scale:CGFloat = 1.0
@State var fade:Double = 0.5 …Run Code Online (Sandbox Code Playgroud)