D-32/DMSwipeCards

Event when a card is displayed

Opened this issue · 2 comments

Hi,

I have to play a bunch of videos retrieved from the internet on cards. This is my view generator.

let viewGenerator: (Video, CGRect) -> (UIView) = { (video: Video, frame: CGRect) -> (UIView) in
      let containerView = UIView(frame: self.view.bounds)
      
      let asset = AVURLAsset(url: URL(string: video.url)!)
      asset.resourceLoader.setDelegate(self, queue: DispatchQueue.main)
      
      let player = AVPlayer(playerItem: AVPlayerItem(asset: asset))
      player.actionAtItemEnd = .none
      
      let playerLayer = AVPlayerLayer(player: player)
      playerLayer.frame = self.view.bounds
      playerLayer.backgroundColor = UIColor.clear.cgColor
      
      containerView.layer.addSublayer(playerLayer)
      
      player.play()
      return containerView
  }

Is there a way to get notified when each card is shown in the screen? A delegate method perhaps.

The reason is, it's a little different than displaying static views or images. Because view/image cards are sort of "preloaded", right? When I add video player cards in the view generator, I have to set it to play player.play() right within the generator. The problem is then all the preloaded videos also get played simultaneously.

If there's a way to get notified when each card is displayed, maybe I could make it play when that happens.

D-32 commented

Inside DMSwipeCardsView.swift locate the two methods cardSwipedLeft & cardSwipedRight. In both methods, before calling loadNextCard, you should have the card that now has become on top somewhere in the self.loadedCards array. Probably it's the last element. You could then force cast it to your own class & call your play method.

maybe we can improve on this, by making a delegate function as currentCard id / value, etc.?