0

SnapChat과 유사한 기능을 일부 구축하고 있습니다. 보기를 길게 누르면 영화가 재생되고 동영상이 끝나거나 (현재 작동 중) 또는 사용자가 손가락을 집어 들었을 때 메인보기 컨트롤러로 돌아갑니다 (이 질문에 대한 것입니다) .스위프트 : 길게 누르면 영화가 재생됩니다. 긴 보도 자료를 어떻게 지속합니까?

내 문제는 IBAction에 있는데, 비디오가 나타나면 UIGestureRecognizerStateBegan에서 Cancelled으로 변경됩니다. 사용자가 해당 좋지 않을까 수행하는 방법에 대한 UIGestureRecognizerState

Ended 등 모든 팁을 등록해야 자신의 손가락을, 리프트까지 상태가 변경되지하는

내가 좋아하는 것입니다. 감사!

class ViewController: UIViewController { 
    var moviePlayer: MPMoviePlayerViewController! 

    @IBAction func handleLongPress(recognizer: UILongPressGestureRecognizer) { 
     println("\(recognizer)") 

     if recognizer.state == UIGestureRecognizerState.Began { 
      playVideo() 
     } 

     if recognizer.state == UIGestureRecognizerState.Ended { 
      self.moviePlayer.moviePlayer.stop() 
     } 
    } 

    func videoHasFinishedPlaying(notification: NSNotification){ 
     println("Video finished playing") 
    } 

    func playVideo() { 
     // get path and url of movie 
     let path = NSBundle.mainBundle().pathForResource("IMG_8602", ofType:"MOV") 
     let url = NSURL.fileURLWithPath(path!) 
     moviePlayer = MPMoviePlayerViewController(contentURL: url) 
     presentMoviePlayerViewControllerAnimated(moviePlayer) 

     // construct the views 
     moviePlayer.view.frame = self.view.bounds 
     self.view.addSubview(moviePlayer.view) 

     // remove controls at top and bottom of video 
     moviePlayer.moviePlayer.controlStyle = MPMovieControlStyle.None 

     NSNotificationCenter.defaultCenter().addObserver(self, selector: "videoHasFinishedPlaying:", 
      name: MPMoviePlayerPlaybackDidFinishNotification, object: nil) 

    } 
} 

편집 : 한 가지 가능한 솔루션은

그래서이 총 우연 이었지만, 나는이 상황에서이 작업을 수행하는 방법을 알아 냈어.

나는 라인을 내 playVideo 함수에서 삭제했다.

왜 그것이 효과가 있었는지는 모르지만 제 맥락에서 효과가있었습니다.

+0

'비슷한'문제가있었습니다. 똑같은 것이 아니라 오랜 제스처에서 드래그 제스처로가는 것에 관심이 있습니다. http://stackoverflow.com/questions/27790899/begin-uipangesture-event-from-a-pressed-state-at-time-of-instantiation/ 27791190 # 27791190 – Aggressor

+0

귀하의 질문에 답변하지 않을 것이지만 제스처를 전달할 방법이 없다고 말할 것입니다. 가장 좋은 방법은 제스처 수신기를 사용하여 수퍼 뷰를 추가하고 하위 뷰를 아래에 추가하는 것입니다. 그리고 나서 당신은 하나의 터치를 처리 할 수있는 슈퍼 뷰에서 이벤트를 micromanage합니다 (다른 뷰가 추가 될 때 취소되지 않습니다). – Aggressor

+0

@Aggressor 링크를 보내 주셔서 감사합니다. 당신을 위해 일하는 방식으로이 일을하는 방법을 보여 줄 수있는 방법이 있습니까? 내 코드를 자유롭게 사용하거나 자신의 코드 인 경우 요지를 붙여 넣으면됩니다. 알아낼 수 있습니다. –

답변

0

이것은 하나의 가능성 일뿐 더 나은 제안이 있습니다.

  1. 당신이보기
  2. 당신이 지금 같은 제스처 내에서 논리를 처리 할 수있는 제스처 인식기를 추가 터치 이벤트
  3. 에게 필요로하는 곳에 상단에 '마스터 뷰'를 추가하지만, 서브 뷰는 그 필요 터치를받는보기 아래에 추가해야합니다.
  4. 사용자가 손가락을 떼면 .ended 상태가됩니다.

주의 사항 보기에 다른 터치 이벤트가있는 경우이 '마스터보기'가 해당 이벤트를 가로 채고 제스처를 위해 가로 챌 것이므로 (동시에 인식하도록 설정하지 않는 한)이 '마스터보기'가 맨 위에 표시되지 않도록하십시오. 그렇다면이 '마스터보기'를 중단없이 터치 이벤트를 청취해야하는 화면의 작은 포트로 만들 수 있습니다.

+0

고맙다 Aggressor. 이 답변에 코드를 추가 할 수 있다면 앞으로 많은 사람들을 도울 수 있다고 생각합니다. 나는 # 3에 가장 관심이 많습니다. 터치를받는 사람 아래에 하위보기를 추가하십시오. –

+0

그런 도움이 필요하거나 다른 특정 질문을하는 것이 좋습니다. – Aggressor