Ios 如何使用自定义序列将AVPlayer从源VC传递到目标VC?

Ios 如何使用自定义序列将AVPlayer从源VC传递到目标VC?,ios,swift,avplayer,uistoryboardsegue,Ios,Swift,Avplayer,Uistoryboardsegue,我创建了一个简单的ViewController类,它使用AVPlayer播放直播视频。livestream在viewDidLoad中加载,当用户按play时,它会播放livestream,非常简单 父VC仅设置为纵向 我有另一个按钮,可以使用自定义序列切换到另一个ViewController 如何将AVPlayer及其“状态”传递到目标ViewController。如果AVPlayer当前正在播放,则当它从父VC传递到目标VC时,应保持其状态 仅供参考:我没有使用prepareForSegue

我创建了一个简单的
ViewController
类,它使用
AVPlayer
播放直播视频。livestream在
viewDidLoad
中加载,当用户按play时,它会播放livestream,非常简单

父VC仅设置为纵向

我有另一个按钮,可以使用自定义序列切换到另一个
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   
    }
}
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)

                })
        }
    }
}
CustomSegue.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   
    }
}
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)

                })
        }
    }
}

谢谢。

传递
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
    }
}
在第二视图控制器中:

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
    }
}

注意,演示如何检查
AVPlayer
;'s州。

你知道了吗?