>

Xcode 10+, Swift 4를 사용하고 있으며 iOS 11.4+를 타겟팅하고 있습니다 MPMediaPlayer로

저는 플레이어가 음악 플레이어를 종료 할 때와 같이 플레이어의 볼륨을 프로그래밍 방식으로 페이드 아웃하고 싶습니다. 또한 작동 할 때 VolumeView 디스플레이와 같은 것을보고 싶지 않습니다.

모든 프로그램 볼륨 컨트롤이 더 이상 사용되지 않는 것 같습니다.

많은 관련 게시물을 읽었으며 몇 가지 문제가있는이 기능을 만들었습니다.

@objc func fadeVolume(){
    var sliderView = UISlider()
    //let volumeView = MPVolumeView(frame: CGRect.init(x: self.view.frame.maxX, y: self.view.frame.maxY, width: 0, height: 0))
    let volumeView = MPVolumeView(frame: .zero)
    volumeView.clipsToBounds = true
    volumeView.showsRouteButton = false
    //volumeView.isHidden = true
    volumeView.alpha = 0.001
    for subview in volumeView.subviews {
        if let slider = subview as? UISlider {
            sliderView = slider
            break
        }
    }
    self.view.addSubview(volumeView)
    volumeView.didMoveToSuperview()
    let current:Float = AVAudioSession.sharedInstance().outputVolume
    print("slider value: \(current)")
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
        UIView.animate(withDuration: 0.4, animations: {
            sliderView.setValue(0.0, animated: false)
        }, completion: { finished in
            // If either one of these is uncommented, the VolumeView will display.
            // However, without removing from superview, the VolumeView stays hidden even when I use the phone volume buttons.
            volumeView.removeFromSuperview()
            //volumeView.alpha = 1.0
        })
    }
}

첫 번째 문제 : VolumeView 디스플레이에 화면이 표시됩니다. 다른 프레임을 사용하고 알파 등을 변경하려고 시도했습니다. 마치 애니메이션이 절대 발생하지 않고 마치 완성 블록으로 바로 이동합니다.

두 번째 문제 : VolumeView를 실제로 슈퍼 뷰에서 제거해야합니다. 그렇지 않으면 전화 볼륨 버튼을 사용해도 숨겨져 있습니다. 이 기능을 실행하는 동안에 만 숨겨져 야합니다.

세번째 문제 : 애니메이션 블록은 아무 것도 수행하지 않습니다. 볼륨은 시작점에서 0으로 즉시 바뀝니다 (페이드 없음).

4 번째 문제 : 이것을 테스트하지는 않았지만 앱이 백그라운드에있을 때 작동하지 않는다고 가정합니다. 따라서 앱을 종료 할 때이 기능을 사용하여 볼륨을 희미하게하는 아이디어가 작동하지 않을 수 있습니다.

화면에 아무 것도 표시하지 않고 볼륨을 희미하게하는 방법을 알고 있습니까? 대답은 반드시 MPVolumeView를 사용할 필요는 없지만 MPMediaPlayer와 함께 작동하고 앱을 종료 할 때 필요합니다.

수정 : 아래는 볼륨을 희미하게하는 수정 된 코드이지만 앱이 종료 될 때이를 수행 할 수있는 문제는 여전히 존재합니다. 'appWillTerminate'에서이 코드를 호출 할 수 있지만 앱이 종료 될 때까지 완전히 실행되지는 않습니다.

// Public in ViewController Class:
let volumeView = MPVolumeView()
var sliderView = UISlider()
var currentVolume:Float = 0
//This called by a notification:
    @objc func fadeVolume(){
        // A lot of other posts use these to hide the volume view however I only needed the alpha change
        //volumeView.clipsToBounds = true
        //volumeView.showsRouteButton = false
        //volumeView.isHidden = true
        //print("volume alpha \(volumeView.alpha)")
        volumeView.alpha = 0.001
        self.view.addSubview(volumeView)
        volumeView.didMoveToSuperview()
        if let view = volumeView.subviews.first as? UISlider {
            sliderView = view
        }
        print("slider value: \(sliderView.value)")
        currentVolume = sliderView.value
        changeVolumeSlowly()
    }
    @objc func changeVolumeSlowly(){
        sliderView.value = sliderView.value - 0.1
        print("\(sliderView.value)")
        if sliderView.value > 0 {
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { [weak self] in
                self?.changeVolumeSlowly()
            }
        } else {
            myMP.pause()
            myMP.stop()
            //reset
            // Since the volumeView is 'global' to the app, if you do not change
            // it back to the previous volume and make it visible you won't see it unless you restart your app.
            //Unfortunately these cause the volume view to flash onscreen
            volumeView.alpha = 1.0
            sliderView.value = currentVolume
            volumeView.removeFromSuperview()
        }
    }

  • 이전 macOS 용 Swift의 사용자 환경 변수에 액세스
  • 다음 php - 테이블 중 하나가 주문 항목을 저장하는 다 대다 관계의 스키마를 설계하는 방법은 무엇입니까?