小编Wit*_*ski的帖子

在 iOS 上使用 AVAudioPlayer 播放静音的最佳方式

我发现自己处于一种需要模拟音频播放来欺骗操作系统控件并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 …

avaudioplayer ios swift avkit

6
推荐指数
1
解决办法
472
查看次数

与 SPM 库一起导入另一个包

想象一下当您的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,而且每次LibraryBApp源文件中导入时,LibraryA都会随之导入,这非常方便。

这同样适用于可以在 Xcode 框架标头中找到的默认 Foundation 导入:

#import <LibraryA/MyLibraryA.h>
Run Code Online (Sandbox Code Playgroud)

现在使用 SPM,我需要在我使用它的任何地方手动导入 Foundation。

问:在单独使用 SPM 包时是否可以达到相同的结果?

我还没有找到关于这个问题的任何资源。谢谢!

xcode swift swift-package-manager

5
推荐指数
1
解决办法
239
查看次数

Swift 组合布局 contentInsets.top 不适用于标题

我正在UICollectionViewCompositionalLayout用 进行创作NSCollectionLayoutSection。我有带有指定标题的部分。对部分的设置contentInsets按预期工作,但对contentInsets标题的设置仅适用于水平对齐(前导和尾随都可以)。问题是顶部和底部插图不适用于标题。节已supplementariesFollowContentInsets设置为false,标题已extendsBoundary设置为true。有什么想法为什么会发生吗?我可以发布代码,但现在我没有发布,因为它很长。谢谢!

uikit uicollectionview swift uicollectionviewcompositionallayout

5
推荐指数
1
解决办法
3377
查看次数

DispatchGroup 会永远等待吗?

我想知道以下场景。

我有一个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

3
推荐指数
1
解决办法
72
查看次数

使用 imagePicker 时 ImageView 旋转

我有一个表格视图,在单元格中,有一个图像和 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 上看过类似的帖子,但解决方案似乎不起作用。
有什么建议? …

iphone xcode uikit ios swift

2
推荐指数
2
解决办法
2004
查看次数

SwiftUI - 如何访问“WindowScene”

在观看 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 中的某些内容才能获取正确的对象。

xcode swiftui

2
推荐指数
1
解决办法
4068
查看次数

如何在 iOS 中全屏显示 Twilio 视频视图

我正在尝试学习适用于 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)

问题是视频没有在remoteViewHolderVideoView( ) 的父视图( )renderer上完全显示

我浏览了官方的快速入门指南,但找不到全屏显示视频的方法,即完全覆盖父视图。

请参阅随附的屏幕截图。

截屏

如何全屏显示视频?任何帮助,将不胜感激。谢谢你!

twilio ios swift

0
推荐指数
1
解决办法
695
查看次数