D-32 / DMSwipeCards

🃏 Tinder like card interface
MIT License
253 stars 31 forks source link

Event when a card is displayed #8

Open Isuru-Nanayakkara opened 6 years ago

Isuru-Nanayakkara commented 6 years ago

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 6 years ago

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.

i-am-chris commented 6 years ago

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