gpt4 book ai didi

animation - SwiftUI动画: Some implicit transition animations broken on iOS 13?

转载 作者:行者123 更新时间:2023-12-03 13:34:14 26 4
gpt4 key购买 nike

在Xcode 11.3.1和11.4上进行了测试:

将隐式动画附加到转场时,某些转场类型似乎已损坏。具体来说,任何与位置相关的过渡都不会应用给定的隐式动画。 .slide.move.offset损坏。 .opacity.scale似乎还可以。 (见附件)

明确的动画似乎在所有情况下都可以正常工作。

即使使用自定义复合过渡,与位置相关的子过渡也不会响应隐式动画。

这是错误,还是预期的行为?

如果您要基于隐式属性更改为特定的UI元素触发多个不同的动画曲线,似乎将是一个问题。

enter image description here


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: {
withAnimation(self.myAnimation) {
self.isShowing.toggle()
}
}) {
Text("Explicit Toggle")
}
}
}

}

struct MyBigFont: ViewModifier {
func body(content: Content) -> some View {
content
.lineLimit(1)
.padding()
.background(Color.purple)
.foregroundColor(.white)
.cornerRadius(8)
.font(Font.system(size: 21).bold())
}
}

struct MyCustomTransition: ViewModifier {

var isEnabled: Bool

func body(content: Content) -> some View {

if isEnabled {
return content
.offset(x: 20.0, y: 0.0)
.opacity(0)
} else {
return content
.offset(x: 0.0, y: 0.0)
.opacity(1)
}

}
}

extension AnyTransition {
static let myCustomTransition = AnyTransition.modifier(
active: MyCustomTransition(isEnabled: true),
identity: MyCustomTransition(isEnabled: false))
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
VStack {
MyExample()
Spacer()
}
}
}

最佳答案

为了使隐式过渡正确地可动画设置,它需要制作可动画的包含这些过渡的容器。

使用Xcode 11.4/iOS 13.4进行了测试。

demo

这是唯一的解决方法:

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 {

... // all your code here

}
}.animation(myAnimation) // << fix !!
}
}

关于animation - SwiftUI动画: Some implicit transition animations broken on iOS 13?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60959593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com