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()
}
}
- 답변 # 1
관련 자료
- sprite kit - Spritekit 및 GameplayKit을 사용하여 Swift에서 목표로 움직이는 GKAgent2D를 어떻게 애니메이션 할 수 있습니까?
- ios - REST API를 사용하여 POST를 요청하는 방법을 알고 싶습니다 (빠른)
- kubernetes 볼륨 사용을 피할 수 있습니까?
- css animations - CSS를 사용하여 div 위치를 하나씩 애니메이션하는 방법은 무엇입니까?
- swiftui - 신속한 UI를 사용하여 한 텍스트에서 다른 텍스트로 전환하는 애니메이션 방법은 무엇입니까?
- 아래 코드가 신속한 삼항 연산자를 사용하여 작동하지만 다른 경우에는 작동하지 않는 이유
- arrays - API를 사용하여 Json Parsing Swift (알파 유리)
- ios : 메인 앱과 위젯간에 데이터를 공유하는 방법은 무엇입니까?
- iOS14 UIDatePicker에 오프셋이 있습니다.
- ios : Firebase 저장소 URL에서 이미지를로드하는 것은 캐시에서로드하는 경우에도 느리게로드되고 다른 외부 링크는 마이크로 초 내에로드됩니다. 왜?
- ios : 수 또는 행으로 TableView 높이 설정
- iOS 14에서 MFMailComposeViewController를 사용자 정의하는 방법
- ios : 현지화에서 변경하는 동안. 탭 막대 컨트롤러 선택 인덱스 NSInternalInconsistencyException 발생
- ios : 이미지 크기 조정-SDWebImage-
- ios : 현재 장치의 플랫폼을 얻는 방법은 무엇입니까?
- iOS에서 .rsaEncryptionOAEPSHA256 알고리즘과 Java의 호환성
- ios : Swift-UIRotationGestureRecognizer를 통해 여러 뷰 회전
UISlider 변수를 공개하고이 기능을 사용하여 볼륨 사운드를 희미하게합니다.