【问题标题】:How to pass an AVPlayer from Source VC to Destination VC using a custom segue?如何使用自定义 segue 将 AVPlayer 从源 VC 传递到目标 VC?
【发布时间】:2016-03-14 01:23:37
【问题描述】:

我创建了一个简单的ViewController 类,它使用AVPlayer 播放直播视频。直播在viewDidLoad加载,当用户按下播放时,它播放直播,很简单。

父 VC 设置为仅纵向。

我有另一个按钮,它使用自定义 segue 连接到另一个 ViewController

如何将 AVPlayer 及其“状态”传递给目标 ViewController?......即如果 AVPlayer 当前正在播放,它应该在从父 VC 传递到目标 VC 时保持其状态。

仅供参考:我没有使用prepareForSegue

这是完整的简单代码:

ViewController.swift:

class ViewController: UIViewController {
    @IBOutlet var playerView: UIView!
    var player = AVPlayer()
    var avPlayerLayer: AVPlayerLayer!

    override func viewDidLoad()
    {
        super.viewDidLoad()

        let url = "http://vevoplaylist-live.hls.adaptive.level3.net/vevo/ch1/appleman.m3u8"  //"http://68.235.37.11:1935/vietmagazine/vietmagazine/playlist.m3u8"

        let playerItem = AVPlayerItem( URL:NSURL( string:url )! )
        player = AVPlayer(playerItem:playerItem)

        avPlayerLayer = AVPlayerLayer(player: player)

        // Add the layer to the view
        playerView.layer.insertSublayer(avPlayerLayer, atIndex: 0)

    }

    @IBAction func playVIdeo(sender: AnyObject)
    {
        avPlayerLayer.player!.play()
    }

    @IBAction func change(sender: AnyObject)
    {
        avPlayerLayer.player!.pause()

        self.performSegueWithIdentifier("CustomSegue", sender: self)
    }

    override func viewWillLayoutSubviews()
    {
        super.viewWillLayoutSubviews()

        // Layout subviews manually
        avPlayerLayer.frame = playerView.bounds   
    }
}

CustomSegue.swift:

class CustomSegue: UIStoryboardSegue
{
    override func perform()
    {
        let sourceVC = self.sourceViewController
        let destinationVC = self.destinationViewController

        sourceVC.view.addSubview(destinationVC.view)

        destinationVC.view.transform = CGAffineTransformMakeScale(0.05, 0.05)

        UIView.animateWithDuration(0.5, delay: 0.0, options: .CurveEaseInOut, animations: { () -> Void in

            destinationVC.view.transform = CGAffineTransformMakeScale(1.0, 1.0)

            } ) { (finished) -> Void in

                destinationVC.view.removeFromSuperview()

                let time = dispatch_time(DISPATCH_TIME_NOW, Int64(0.001 * Double(NSEC_PER_SEC)))

                dispatch_after(time, dispatch_get_main_queue(), { () -> Void in

                    sourceVC.presentViewController(destinationVC, animated: false, completion: nil)

                })
        }
    }
}

谢谢。

【问题讨论】:

  • 你发现了吗?

标签: ios swift avplayer uistoryboardsegue


【解决方案1】:

传递AVPlayer 实例是否足以传递播放器及其状态?

未经测试,但这有效吗?在第一个视图控制器中:

class ViewController: UIViewController {
  var player = AVPlayer()

  @IBAction func myAction(sender: AnyObject) {
    performSegueWithIdentifier("TheSegue", sender: self)
  }
}

class MySegue: UIStoryboardSegue {
  override func perform() {
      let viewController = sourceViewController as! ViewController
      let secondViewController = destinationViewController as! SecondViewController
      secondViewController.player = viewController.player
      sourceViewController.presentViewController(destinationViewController, animated: true, completion: nil)
  }
}

在第二个视图控制器中:

class SecondViewController: UIViewController {
    var player: AVPlayer!

    override func viewDidLoad() {
        // Do something with the player
    }
}

注意,this answer 显示如何检查 AVPlayer; 的状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2016-02-26
    • 1970-01-01
    • 2021-01-16
    相关资源
    最近更新 更多