如何隐藏音量指示器与swiftui在ios

4jb9z9bj  于 2022-12-10  发布在  Swift
关注(0)|答案(1)|浏览(189)

我正在写一个音乐播放器应用程序使用苹果媒体播放器,并有一个按钮来改变音量和隐藏系统默认的音量覆盖.然而,我发现的所有方法都是基于UIKit.像

let volumeView = MPVolumeView(frame: .zero)       
volumeView.clipsToBounds = true
volumeView.alpha = 0.00001
volumeView.showsVolumeSlider = false
view.addSubview(volumeView)

我试过了

import Foundation
import SwiftUI
import MediaPlayer
struct VolumeView:UIViewRepresentable{
    let volumeView:MPVolumeView
    func makeUIView(context: Context) -> MPVolumeView {
        volumeView.clipsToBounds = true
        volumeView.alpha = 0.00001
        volumeView.showsVolumeSlider = false
        return volumeView
    }
    
    func updateUIView(_ uiView: MPVolumeView, context: Context) {
        
    }
    
    typealias UIViewType = MPVolumeView
    
    
}

它接收我在视图模型中创建的MPVolumeView,并将其放置在swiftui视图中。指示器消失,但无法更改音量。然后我尝试在UIViewRepresentable中创建MPVolumeView的新示例,但也没有成功。我是swiftui的绿色,有人能帮助我吗?

eufgjt7s

eufgjt7s1#

我也有同样的问题,你的例子帮助我弄清楚了,显然你就快到了。
这是SwiftUI中的一个完整的自定义音量滑块

struct VolumeSliderView: View {

    var primaryColor: Color

    @StateObject var volumeViewModel = VolumeViewModel()
    
    var body: some View {
        ZStack {
        
            VolumeView()
                .frame(width: 0, height: 0)
        
            Slider(value: $volumeViewModel.volume, in: 0...1) {
                Text("")
            } minimumValueLabel: {
                Image(systemName: "speaker.fill")
                    .font(.callout)
                    .foregroundColor(primaryColor.opacity(0.6))
            } maximumValueLabel: {
                Image(systemName: "speaker.wave.3.fill")
                    .font(.callout)
                    .foregroundColor(primaryColor.opacity(0.6))
            } onEditingChanged: { isEditing in
                volumeViewModel.setVolume()
            }
            .tint(primaryColor.opacity(0.6))
        }
    }
}

import Foundation
import MediaPlayer

struct VolumeView: UIViewRepresentable{
    
    func makeUIView(context: Context) -> MPVolumeView {
    
       let volumeView = MPVolumeView(frame: CGRect.zero)
       volumeView.alpha = 0.001

       return volumeView
    }

    func updateUIView(_ uiView: MPVolumeView, context: Context) {
    
    }

}

MPVolumeView的示例似乎需要随时出现在屏幕上,即使它不可见。看起来有点笨拙,但可以工作。如果我只在setVolume()函数中隐藏视图,甚至在那里调用volumeView.showsVolumeSlider = false,也不会有什么不同。

class VolumeViewModel: ObservableObject {

    @Published var volume: Float = 0.5

    init() {
        setInitialVolume()
    }

    private func setInitialVolume() {
        volume = AVAudioSession().outputVolume
    }

    func setVolume() {
    
        let volumeView = MPVolumeView()
    
        let slider = volumeView.subviews.first(where: { $0 is UISlider }) as? UISlider
    
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.03)     {
            slider?.setValue(self.volume, animated: false)
        }
    }
}

希望它能帮助一些人,因为我刚刚在SO上发现了非工作示例。

相关问题