swift - 延迟 SwiftUI 组合转换
问题描述
使用以下代码,目的是让过渡同时淡入(不透明度)和向下移动(偏移),但延迟为 0.3 秒。
有了这个,0.3 秒后只有不透明度过渡可见:
.transition(.offset(x: 0, y: -20)
.combined(with: .opacity)
.animation(.easeOut.delay(0.3)))
我想也许动画必须在两个过渡上设置,初始和组合的一个像这样(剧透:与以前相同的结果):
.transition(.offset(x: 0, y: -20)
.combined(with:.opacity.animation(.easeOut.delay(0.5)))
.animation(.easeOut.delay(0.5)))
更改顺序也不会改变结果:
.transition(.offset(x: 0, y: -20)
.animation(.easeOut.delay(0.5))
.combined(with: .opacity.animation(.easeOut.delay(0.5))))
那么我在这里做错了什么?如何延迟合并转换?
解决方案
试试这个
extension AnyTransition {
static var delayAndFade: AnyTransition {
return AnyTransition.identity
.combined(with: .opacity)
.animation(.default.delay(3))
}
}
如果要移动视图,则应offset
使用该withAnimation
功能对其进行动画处理。
Text("Move and fade.")
.offset(y: offset)
.transition(.delayAndFade)
struct ContentView: View {
@State private var showDetails = false
@State var offset:CGFloat = 0
var body: some View {
VStack {
Button("Press to show details") {
showDetails.toggle()
withAnimation(.default.delay(3)) {
self.offset = -20
}
}
if showDetails {
Text("Move and fade.")
.offset(y: offset)
.transition(.delayAndFade)
}
}
}
}
更新
extension AnyTransition {
static var moveAndFade: AnyTransition {
return AnyTransition.move(edge: .top)
.combined(with: .opacity)
}
}
试试这个
HStack {
Text("Move and fade.")
}
.animation(Animation.default.delay(2))
.transition(.moveAndFade)
它适用于除文本之外的所有类型的视图。
struct ContentView: View {
@State private var showDetails = false
@State var offset:CGFloat = 0
var body: some View {
VStack {
Button("Press to show details") {
showDetails.toggle()
}
if showDetails {
// Works!
HStack {
Text("Move and fade.")
}
.animation(Animation.default.delay(2))
.transition(.moveAndFade)
Button("Move and fade.") {}
.animation(Animation.default.delay(2))
.transition(.moveAndFade)
// Does not work
Text("Move and fade.")
.animation(Animation.default.delay(2))
.transition(.moveAndFade)
}
}
}
}
推荐阅读
- php - 如何从两个不同的数据库获取数据,但 cakephp 2.5 中的表名相同?
- node.js - 由于 amdefine,Typescript 生成的代码无法运行
- java - Telegram Bot 检查该机器人是否在 Group 中被提及
- c# - HttpListenerContext 将“%EF%BF%BD”递归添加到 HttpListener.request.url
- python-3.x - 在 tkinter 中不同类的实例之间传递数据
- javascript - 在 location.replace 之后如何捕获窗口的加载事件(网址更改)
- amazon-web-services - 如何对 AWS S3 存储桶访问进行速率限制
- java - 在多线程环境中迭代集合:ConcurrentModificationException
- email-validation - 这是一个有效的电子邮件“john.doe@hello.example.com”吗?
- angular - 没有使用 pptxGenjs 库在 angular5 中获取数据流