我发现自己处于一种需要模拟音频播放来欺骗操作系统控件并MPNowPlayingInfoCenter
认为正在播放音频的情况。这是因为我正在构建一个播放多个音轨的播放器,并在创建一个连续的“音频”音轨之间暂停。我已经在应用程序本身内完成了所有设置,并且锁定屏幕控件工作正常,但我面临的唯一问题是当实际音频停止并且正在“播放”暂停时,锁定屏幕信息中心停止计时器,并且只有当另一个音轨开始播放时,它才会继续显示正确的时间和整体状态。
这是我从音频文件和暂停项目构建的音轨的示例:
let items: [AudioItem] = [
.audio("part-1.mp3"),
.pause(duration: 5), // value of type: TimeInterval
.audio("part-2.mp3"),
.pause(duration: 3),
... // the list goes on
]
Run Code Online (Sandbox Code Playgroud)
然后在我的自定义播放器中,一旦AVAudioPlayer
完成当前项目的工作,我就会从数组中获取下一个项目,并.pause
使用预定的播放器播放 aTimer
或.audio
使用AVAudioPlayer
.
extension Player: AVAudioPlayerDelegate {
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
playNextItem()
}
}
Run Code Online (Sandbox Code Playgroud)
问题就在这里,一旦AVAudioPlayer
停止,“正在播放”信息中心也会自动停止,尽管我一直在喂它新鲜的nowPlayingInfo
。然后,当它碰到另一个.audio
项目时,它会正确恢复并显示当前时间等。
我如何欺骗他们MPNowPlayingInfoCenter
认为我“播放”我的.pause
项目时正在播放音频?
我意识到我想要实现的目标可能仍然不清楚,但如果需要,我很乐意分享更多见解。谢谢!
A. 保留 1 秒长的空音轨,只要需要暂停即可循环播放。
B. 以编程方式创建具有适当长度的空音轨并播放它,而不是用于Timer
跟踪暂停持续时间/进度并完全依赖 AVAudioPlayer 来处理和.audio …
想象一下当您的App
项目使用两个自定义库时的这种情况
.xcworkspace
|- App.xcodeproj
|- LibraryA.xcodeproj
|- LibraryB.xcodeproj
Run Code Online (Sandbox Code Playgroud)
由于在这种情况下我们正在使用 Xcode 框架,因此可以将以下内容添加LibraryB
到头文件中:
.xcworkspace
|- App.xcodeproj
|- LibraryA.xcodeproj
|- LibraryB.xcodeproj
Run Code Online (Sandbox Code Playgroud)
现在不仅不需要LibraryA
在源 od 中导入LibraryB
,而且每次LibraryB
在App
源文件中导入时,LibraryA
都会随之导入,这非常方便。
这同样适用于可以在 Xcode 框架标头中找到的默认 Foundation 导入:
#import <LibraryA/MyLibraryA.h>
Run Code Online (Sandbox Code Playgroud)
现在使用 SPM,我需要在我使用它的任何地方手动导入 Foundation。
问:在单独使用 SPM 包时是否可以达到相同的结果?
我还没有找到关于这个问题的任何资源。谢谢!
我正在UICollectionViewCompositionalLayout
用 进行创作NSCollectionLayoutSection
。我有带有指定标题的部分。对部分的设置contentInsets
按预期工作,但对contentInsets
标题的设置仅适用于水平对齐(前导和尾随都可以)。问题是顶部和底部插图不适用于标题。节已supplementariesFollowContentInsets
设置为false
,标题已extendsBoundary
设置为true
。有什么想法为什么会发生吗?我可以发布代码,但现在我没有发布,因为它很长。谢谢!
uikit uicollectionview swift uicollectionviewcompositionallayout
我想知道以下场景。
我有一个DispatchGroup
内部函数。现在我正在后台线程上进入该组并调用wait()
.
func test() {
let group = DispatchGroup()
DispatchQueue.global().async {
group.enter()
group.wait()
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,在主线程离开函数后,该组是否会永远等待或被释放?
我不确定是否有任何引用或捕获。我会非常感谢一些解释,这个话题让我有点困惑。
先感谢您!
concurrency multithreading grand-central-dispatch swift dispatchgroup
我有一个表格视图,在单元格中,有一个图像和 2 个标签。我正在使用imagePicker
从我的相机胶卷中选择一张照片并将该照片放入单元格图像中。但是,当照片是人像模式照片时,图像会旋转 90 度。
在下面的代码中,posting 是一个连接到imageview
表视图单元格中的插座,我初始化了一个UIImagePickerController
.
class MakePostVC: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBOutlet weak var postImg: UIImageView!
@IBOutlet weak var postTitle: UITextField!
@IBOutlet weak var postDescrip: UITextField!
var imgPicker: UIImagePickerController!
override func viewDidLoad() {
super.viewDidLoad()
postImg.layer.cornerRadius = 30
postImg.clipsToBounds = true
imgPicker = UIImagePickerController()
imgPicker.delegate = self
}
Run Code Online (Sandbox Code Playgroud)
这是我的功能didFinishPickingImage
:
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
imgPicker.dismissViewControllerAnimated(true, completion: nil)
postImg.image = image
}
Run Code Online (Sandbox Code Playgroud)
我在 SO 上看过类似的帖子,但解决方案似乎不起作用。
有什么建议? …
在观看 WWDC 21 视频参考 StoreKit 2 时,他们引用了一些函数,其中他们让值 =WindowScene
如下:
func manageSubscriptions() async {
if let windowScene = self.view.window?.windowScene {
do {
try await AppStore.showManageSubscriptions(in: windowScene)
} catch {
//error
}
}
}
Run Code Online (Sandbox Code Playgroud)
let 行出错并显示以下消息:Type of expression is ambiguous without more context
如果我尝试提供更多上下文,例如:
if let windowScene = (self.view.window?.windowScene)! as UIWindowScene {
Run Code Online (Sandbox Code Playgroud)
有人告诉我:Value of type 'MyStruct' has no member 'view'
我缺少什么,必须是简单的东西才能访问这个所需的 UI 元素?
谢谢
补充: 我想补充一点,我使用的是使用 SceneDelegate 和 AppDelegate 创建的 SwiftUI 应用程序,而不是简单的结构:App,结构类型。所以我猜我需要访问 SceneDelegate 中的某些内容才能获取正确的对象。
我正在尝试学习适用于 iOS 的 Twilio 视频 sdk。
我实现了以下代码来在视图上显示远程视频。
if let camera = CameraSource(options: options, delegate: self),
let videoTrack = LocalVideoTrack(source: camera) {
let bounds = self.remoteViewHolder.bounds
print("bounds = \(bounds)")
if let renderer = VideoView(frame: self.remoteViewHolder.bounds, delegate: self) {
videoTrack.addRenderer(renderer)
renderer.backgroundColor = .cyan
self.remoteView = renderer
self.localVideoTrack = videoTrack
self.camera = camera
self.remoteViewHolder.addSubview(renderer)
}
}
guard let device = AVCaptureDevice.default(AVCaptureDevice.DeviceType.builtInWideAngleCamera, for: .video, position: .front) else {
return
}
self.camera.startCapture(device: device)
Run Code Online (Sandbox Code Playgroud)
问题是视频没有在remoteViewHolder
VideoView( ) 的父视图( )renderer
上完全显示
我浏览了官方的快速入门指南,但找不到全屏显示视频的方法,即完全覆盖父视图。
请参阅随附的屏幕截图。
如何全屏显示视频?任何帮助,将不胜感激。谢谢你!