티스토리 뷰

728x90

 

1년동안 준비했던 결혼도 성공적으로 끝마쳤고,

신혼여행가서 신나게 놀다가 돌아와보니 슬랙, iOS 단톡방 등 읽을게 너무 많이 쌓여있었다. (현실자각)

푹 쉬고 돌아왔으니 다시 맘 잡고 시작해보자

 

근데 발리 진짜 석양맛집🌅

발리 선셋 🌅


 

오늘은

전체화면으로 동영상 재생중에 닫힘 버튼을 눌렀을때를 감지 하는걸 블로깅해보려고 합니다.

별것 없는것 같아 보이지만, 이번 작업을 통해 문제를 해결하기 위한 방법은 많다는걸 배웠습니다.

사진입니다.. 😅

 

요구조건

1. 타사 영상 플랫폼이 아닌 앱 내에서 바로 보여질것

2. 전체화면으로만 보여질것

3. 전체화면이 닫혔을때 이전화면으로 돌아갈것

 

 

고민했던점

 

시안을 보자마자 고민했던건

1. 비디오면 AVFoundation이지!

2. AVPlayerVC를 사용해서

3. 'X' 버튼을 눌렀을때 닫힘을 감지해야하니까 AVPlayerVC의 라이프사이클 viewWillDisappear로 닫았을때 감지가 되겠지!

 

 

응 안돼~

 

/// AVPlayerViewController 감지

extension AVPlayerViewController {
    
    open override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        
        print("닫힘")
    }
}

 

 

뭔가 동작은 하는데 'X' 버튼을 눌렀을때가 아닌 '전체화면' 버튼을 눌렀을때 

print로 "닫힘"이 찍히고 있었다.. 

요것도 사진이에요

 

이때부터 혼자 삽질시작

  • 전체화면 버튼 감지하는 방법
  • 전체화면으로 시작을해서 닫기버튼만 나오게 하는방법 (이것도 닫기버튼 눌렀을때 viewWillDisappear가 먹히지 않음)
  • AVPlayer 닫기버튼 감지 하는 방법 등등

AVPlayerviewWillDisappear, viewDidDisappear, 비디오플레이어 컨트롤러 키워드에만 꽂혀서 폭풍검색과 삽질을 하다가..

 

 

 

해결

 

비디오관련해서는 AVFoundation, AVPlayer 같은것만 생각나서 해당 키워드에 대해서만 검색했었고 (ex. how to detect avplayer close button ...) 

안드로이드 동료개발자분이 embed video 라는 키워드를 알려줘 바로 구글링 검색.

WebView로 영상을 띄워주는 방식이라 따로 다른 영상 플랫폼을 통하지 않아도 됐었고

 

남은 하나 'X' 버튼을 눌렀을때를 감지하고 싶었는데 비디오 플레이어 컨트롤러의 일부를 없애거나 추가하는 방법은 있었지만 하고싶었던 'X'를 눌렀을때 감지할 수 있는 기능은 없었다.

다행히도(?) 시안은 전체화면으로만 나오면됐기 때문에 전체화면에 대한 상태를 감지하는게 있어 아래 메서드를 사용했습니다.

 

didBecomeVisibleNotification

- window가 나타날때 알림

 

didBecomeHiddenNotification

- window가 사라질때 알림

 

사실 전체화면만 감지한다기보단 isHidden 속성에 대한 변경 사항을 감지

 

아래는 적용했던 코드 

    // 전체화면 감지
    private func observeFullScreen() {
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(onDidEnterFullscreen(_:)),
            name: UIWindow.didBecomeVisibleNotification,
            object: nil
        )
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(onDidLeaveFullscreen(_:)),
            name: UIWindow.didBecomeHiddenNotification,
            object: nil
        )
    }
    
    @objc func onDidEnterFullscreen(_ notification: Notification) {
        print("전체화면이 됐을때 호출")
    }
    
    @objc func onDidLeaveFullscreen(_ notification: Notification) {
    	print("전체화면이 닫혔을때 호출")
    }
    
    // 메모리해제 됐을때 해당 observer삭제
    private func removeObserver() {
        NotificationCenter.default.removeObserver(self, name: UIWindow.didBecomeVisibleNotification, object: nil)
        NotificationCenter.default.removeObserver(self, name: UIWindow.didBecomeHiddenNotification, object: nil)
    }

 

 

 

 

느낀점

 

이번 작업을 하고 '급할수록 돌아가라' 라는 말이 문득 생각 났었다.

하나에 꽂혀서 주구장창 해결하려다 보면 혼자 너무 깊이 들어와있는 경우가 간혹 있는데

그럴때 내 상황을 누군가와 공유해 또다른 조언을 구하는게 더 좋은 방법이란걸 배웠다.

비록 다른분야라도 해결하는 방법은 제 각각 다르기 때문에 더 좋은 아이디어를 얻을 수 있다!

 

물론 해결해보려고 하지도 않고 질문은 금지 (핑프 금지)

 

728x90