ios - Why does my time UILabels skip 2 seconds when it resumes play from a pause state? -


i'm having weird issue using mpmovieplayercontroller. have currenttimelabel representing current playback time , endtimelabel representing remaining playback time. function update labels fired off every 1 second using nstimer.

this coincides uislider increments every second video plays. however, problem is, video playing, , tap pause button, when tap play button again, currenttimelabel , endtimelabel jumps 2 seconds wherever last stopped.

here's provided code:

override func viewdidload() {     super.viewdidload()      print("viewdidload")     nsnotificationcenter.defaultcenter().addobserver(         self,         selector: "movieplayerplaybackstatedidchangenotification:",         name: mpmovieplayerplaybackstatedidchangenotification,         object: nil)      nsnotificationcenter.defaultcenter().addobserver(         self,         selector: "movieplayerloadstatedidchangenotification:",         name: mpmovieplayerloadstatedidchangenotification,         object: nil)      setupvideoplayer()      isplaybackslidertouched = false      ispausebuttontouched = false }  override func viewdidappear(animated: bool) {     super.viewdidappear(true)      print("viewdidappear")      timer = nstimer.scheduledtimerwithtimeinterval(1, target: self, selector: "updateplaybackslider", userinfo: nil, repeats: true)      playpausebutton.addtarget(self, action: "onclick:", forcontrolevents: .touchupinside) }  func convertsecondstohhmmss(seconds: double) -> string {     let time: int = int( floor(seconds) )      print("time = \(time)")      // convert hours     let hh: int = time / 3600      // convert minutes     let mm: int = (time / 60) % 60      // convert seconds     let ss: int = time % 60      print("seconds = \(ss)")      if hh > 0     {         return string(format: "%02d:%02d:%02d", hh, mm, ss)     }     else     {         return string(format: "%02d:%02d", mm, ss )     } }  func updateplaybackslider() {     if isplaybackslidertouched == false     {         print("playbackslider not touched!")          print("youtubevideoplayer.movieplayer.currentplaybacktime = \(youtubevideoplayer.movieplayer.currentplaybacktime)")         print("youtubevideoplayer.movieplayer.duration = \(youtubevideoplayer.movieplayer.duration)")          let slidervalue: float = float(youtubevideoplayer.movieplayer.currentplaybacktime / youtubevideoplayer.movieplayer.duration)          print("slidervalue = \(slidervalue)")         if !slidervalue.isnan         {             self.playbackslider.setvalue(slidervalue, animated: true)              self.currenttimelabel.text = self.convertsecondstohhmmss(self.youtubevideoplayer.movieplayer.currentplaybacktime)             self.endtimelabel.text = "-" + self.convertsecondstohhmmss(self.youtubevideoplayer.movieplayer.duration - self.youtubevideoplayer.movieplayer.currentplaybacktime)              print("currenttimelabel.text = \(currenttimelabel.text)")             print("endtimelabel.text = \(endtimelabel.text)")         }     } }  func onclick(sender: uibutton) {     print("onclick")     if sender == playpausebutton     {         print("playpausebutton touched")          if sender.selected         {             print("player play")             timer = nstimer.scheduledtimerwithtimeinterval(1, target: self, selector: "updateplaybackslider", userinfo: nil, repeats: true)              ispausebuttontouched = false             youtubevideoplayer.movieplayer.play()              sender.selected = false         }         else         {             print("player paused")             ispausebuttontouched = true             timer.invalidate()             timer = nil              youtubevideoplayer.movieplayer.pause()              sender.selected = true         }     } }  func movieplayerplaybackstatedidchangenotification(notification: nsnotification) {     print("movieplayerplaybackstatedidchangenotification")      let state: mpmovieplaybackstate = youtubevideoplayer.movieplayer.playbackstate      switch state     {     case mpmovieplaybackstate.stopped:         print("stopped")         break      case mpmovieplaybackstate.interrupted:         print("interrupted")         break      case mpmovieplaybackstate.seekingforward:         print("forward")         break      case mpmovieplaybackstate.seekingbackward:         print("backward")         break      case mpmovieplaybackstate.paused:         print("paused")         break      case mpmovieplaybackstate.playing:         print("playing")         break     } }      func movieplayerloadstatedidchangenotification(notification: nsnotification) {     print("movieplayerloadstatedidchangenotification")      let state: mpmovieloadstate = youtubevideoplayer.movieplayer.loadstate      switch state     {     case mpmovieloadstate.playable:         print("playing")         break      case mpmovieloadstate.playthroughok:         print("playthroughok")         break      case mpmovieloadstate.stalled:         print("stalled")         break      case mpmovieloadstate.unknown:         print("unknown")         break      default:         break     } } 

here's output couple seconds of video playback:

viewdidload setupvideoplayer viewdidappear movieplayerloadstatedidchangenotification time = 0 seconds = 0 time = 29 seconds = 29 playing movieplayerloadstatedidchangenotification movieplayerplaybackstatedidchangenotification playing playbackslider not touched! youtubevideoplayer.movieplayer.currentplaybacktime = 0.0 youtubevideoplayer.movieplayer.duration = 29.8833333333333 slidervalue = 0.0 time = 0 seconds = 0 time = 29 seconds = 29 currenttimelabel.text = optional("00:00") endtimelabel.text = optional("-00:29") playbackslider not touched! youtubevideoplayer.movieplayer.currentplaybacktime = 0.484628237 youtubevideoplayer.movieplayer.duration = 29.8833333333333 slidervalue = 0.016255 time = 0 seconds = 0 time = 29 seconds = 29 currenttimelabel.text = optional("00:00") endtimelabel.text = optional("-00:29") playbackslider not touched! youtubevideoplayer.movieplayer.currentplaybacktime = 1.484112736 youtubevideoplayer.movieplayer.duration = 29.8833333333333 slidervalue = 0.0496863 time = 1 seconds = 1 time = 28 seconds = 28 currenttimelabel.text = optional("00:01") endtimelabel.text = optional("-00:28") onclick playpausebutton touched player paused movieplayerplaybackstatedidchangenotification paused ispausebuttontouched = true onclick playpausebutton touched player play movieplayerplaybackstatedidchangenotification playing playbackslider not touched! youtubevideoplayer.movieplayer.currentplaybacktime = 3.34555252 youtubevideoplayer.movieplayer.duration = 29.8833333333333 slidervalue = 0.111982 time = 3 seconds = 3 time = 26 seconds = 26 currenttimelabel.text = optional("00:03") endtimelabel.text = optional("-00:26") movieplayerplaybackstatedidchangenotification paused 

as can see in output, currenttimelabel.text = optional("00:01") time when tapped pause. when tap play, output should currenttimelabel.text = optional("00:02"), shows currenttimelabel.text = optional("00:03"). endtimelabel skips 2 seconds.

why happening , how can resolve it?

thanks

resume timer in playing state. might solve issue.

case mpmovieplaybackstate.playing:{                 print("playing")          timer = nstimer.scheduledtimerwithtimeinterval(1, target: self, selector: "updateplaybackslider", userinfo: nil, repeats: true)                 break     } 

Comments

Popular posts from this blog

java - Run spring boot application error: Cannot instantiate interface org.springframework.context.ApplicationListener -

reactjs - React router and this.props.children - how to pass state to this.props.children -

Excel VBA "Microsoft Windows Common Controls 6.0 (SP6)" Location Changes -