控制 Apple Watch 的音量

问题描述 投票:0回答:3

我正在尝试使用 SwiftUI 的代码控制 Apple Watch 本身的音量。

我正在使用

AVPlayer
传输音频。

是否有API可以设置手表的音量或使用Digital Crown来控制音量而无需

  • volume
    上设置
    AVPlayer
    属性。这只是设置相对于系统音量的音量。因此,如果系统静音,则不会增加音量。
  • 使用
    WKInterfaceVolumeControl
    。这可以完成工作,但无法调整大小,并且在小屏幕上占用大量空间。
swiftui avplayer watchos watchos-6
3个回答
8
投票

我最终得到的解决方法是这样的:

  1. 包裹
    WKInterfaceVolumeControl
    以在 SwiftUI 中使用它
struct VolumeView: WKInterfaceObjectRepresentable {
    typealias WKInterfaceObjectType = WKInterfaceVolumeControl


    func makeWKInterfaceObject(context: Self.Context) -> WKInterfaceVolumeControl {
        let view = WKInterfaceVolumeControl(origin: .local)
        Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak view] timer in
            if let view = view {
                view.focus()
            } else {
                timer.invalidate()
            }
        }
        DispatchQueue.main.async {
            view.focus()
        }
        return view
    }
    func updateWKInterfaceObject(_ wkInterfaceObject: WKInterfaceVolumeControl, context: WKInterfaceObjectRepresentableContext<VolumeView>) {
    }
}
  1. 使用
    VolumeView
    opacity = 0
    添加到视图层次结构中。
        .background(VolumeView().opacity(0))
  1. 监听系统的音量更新。
volumeObserver = AVAudioSession.sharedInstance().observe(\.outputVolume) { session, _ in
            print("Output volume: \(session.outputVolume)")
            self.volume = Double(session.outputVolume)
        }

这样您就可以更新其他一些视图,但请记住,特别是对于较旧的内容,更新并不总是会(立即)发生。


1
投票

leoMehlig 的答案仅对我有用,如果我在第一次聚焦之前添加一点延迟并放弃焦点。

所以,用代码来说,我改变了这一点:

DispatchQueue.main.async {
    view.focus()
}

对此:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
    view.resignFocus()
    view.focus()
}

0
投票

leoMehlig 的答案 对我来说按原样工作,但我注意到当我点击手表屏幕上的任意位置时,嵌入式 WKInterfaceVolumeControl 正在失去焦点。

这是因为我在视图层次结构中有一个

.focusable(true)
修饰符,因此在层次结构中进一步点击的任何视图都会保持焦点。

当我尝试将

.focusable(true)
绑定到数字表冠旋转时,我添加了
AVPlayer.volume
,使用
WKInterfaceVolumeControl

时不再需要它
© www.soinside.com 2019 - 2024. All rights reserved.