swift - SwiftUI + Timer + AVPlayer - 音频播放时,onReceive(timer) 未触发
问题描述
我无法让我的计时器(和我的动画)正常工作。如果当前正在播放,我的计时器不会被触发AVPlayer
。一旦我暂停它,我的计时器正在恢复......
我有一个SlidingText
视图的实现。基本上只是将其框中的文本从左向右移动,然后从右向左移动。Timer
此动画每 5 秒触发一次。我有AVPlayer
一个暂停/播放按钮同时播放的东西。
这是SlidingText
. 并且AVPlayer
只是被一个触发player.play()
或的按钮调用player.pause()
。
import SwiftUI
struct SlidingText: View {
let geometryProxy: GeometryProxy
@Binding var text: String
let font: Font
@State private var animateSliding: Bool = false
private let timer = Timer.publish(every: 5, on: .main, in: .common).autoconnect()
private let slideDuration: Double = 3
var body: some View {
ZStack(alignment: .leading, content: {
VStack(content: {
Text(text)
.font(self.font)
.foregroundColor(.white)
.background(Color.red)
})
.id("SlidingText-Animation")
.fixedSize(horizontal: false, vertical: true)
.frame(width: geometryProxy.size.width, alignment: animateSliding ? .trailing : .leading)
.clipped()
.animation(Animation.linear(duration: slideDuration))
.onReceive(timer, perform: { _ in
self.animateSliding.toggle()
})
})
.frame(width: self.geometryProxy.size.width, height: self.geometryProxy.size.height)
.background(Color.yellow)
}
}
我在这里使用计时器的方式有什么问题吗?感谢您对未来的任何帮助!
解决方案
好吧,我最终没有使用计时器,因为它有问题。
对于那些感兴趣的人,它现在看起来像这样,我正在使用动画属性。不再干扰音频播放器。
struct SlidingText: View {
let geometryProxy: GeometryProxy
@Binding var text: String
let font: Font
@State private var animateSliding: Bool = false
private let slideDelay: Double = 3
private let slideDuration: Double = 6
private var isTextLargerThanView: Bool {
if text.size(forWidth: geometryProxy.size.width, andFont: font).width < geometryProxy.size.width {
return false
}
return true
}
var body: some View {
ZStack(alignment: .leading, content: {
VStack(content: {
Text(text)
.font(self.font)
.foregroundColor(.white)
.background(Color.red)
})
.id("SlidingText-Animation")
.fixedSize()
.animation(Animation.linear(duration: slideDuration).delay(slideDelay).repeatForever(autoreverses: true))
.frame(width: geometryProxy.size.width,
alignment: isTextLargerThanView ? (animateSliding ? .trailing : .leading) : .center)
.onAppear(perform: {
self.animateSliding.toggle()
})
})
.clipped()
}
}
推荐阅读
- html - 悬停时两条奇怪的线
- python - 如何检查字符串是否仅包含英文字符,末尾有感叹号?
- .net - 这是否违反了开放/封闭原则?
- android - 无法注册新的 FireBase 用户
- docker - Kubernetes 运行命令详情
- c++ - Visual Studio 2010 C++ 项目链接失败:致命错误 LINK1171:无法加载 ole32.dll
- java - 如何修复我的 RSA 算法(java)中的资源泄漏?
- reactjs - 为什么参数 null 不能分配给打字稿中 setStateAction 类型的参数?
- flutter - 在 MaterialApp 中使用 `home` 属性和 `initialRoute`
- python - /login/user login() 处的 TypeError 采用 1 个位置参数,但给出了 2 个