swiftui - SwiftUI:在带有动画的计时器上更改图像
问题描述
我想在具有不同动画的计时器的视图中更改图像。像滑入、淡入淡出、从小图增长到填充等
struct ContentView: View {
let images = ["1", "2", "3", "4", "5", "6", "7"] // Array of image names to showcase
@State var activeImageIndex = 0 // Index of the currently displayed image
@State var isExpanded = false
let imageSwitchTimer = Timer.publish(every: 5, on: .main, in: .common)
.autoconnect()
var body: some View {
VStack {
Image(images[activeImageIndex])
.resizable()
.aspectRatio(contentMode: .fit)
.padding()
.transition(.asymmetric(insertion: .scale, removal: .opacity))
.animation(.spring())
.onReceive(imageSwitchTimer) { _ in
self.activeImageIndex = (self.activeImageIndex + 1) % self.images.count
}
}
}
}
解决方案
您可以添加一个计算属性来指定基于以下的转换activeImageIndex
:
var transition: AnyTransition {
switch activeImageIndex {
case 0:
return .asymmetric(insertion: .scale, removal: .opacity)
default:
return .identity
}
}
并像这样使用它:
Image(images[activeImageIndex])
.resizable()
.aspectRatio(contentMode: .fit)
.padding()
.transition(transition) // use here
.animation(.spring())
.onReceive(imageSwitchTimer) { _ in
self.activeImageIndex = (self.activeImageIndex + 1) % self.images.count
}
推荐阅读
- macos - 窗口不会关闭
- python - Python内部类自我
- node.js - Firebase 函数获取文本响应错误“JSON 中的意外令牌 H”
- openshift - GlusterFS 存储的扩展只在 Openshift 中添加新的对等体而没有新的砖块
- c# - ASP.NET MVC 使用 FormCollection 从 DropDownList() 获取值
- django - Django中的渐进式Web应用程序,我把文件放在哪里?
- mapbox-android - MapBox Android - 从 5.1.5 迁移到 6.5.0 时查找等效表达式的问题
- android - 上下文菜单上的图标未显示?
- java - 如何使用两个对象字段对列表进行排序?
- python - 摆脱 Dict 的括号和不需要的单词[Python]