public void Setup(CustomVideoLayer layer) { if (!IsSupported() || IsSetep) { return; } if (layer?.VideoLayer != null) { controller = new AVPictureInPictureController(layer.VideoLayer); controller.Delegate = this; } layer.VideoLayerChanged += (AVPlayerLayer obj) => { if (!IsSupported()) { return; } bool isActive = controller?.PictureInPictureActive ?? false; if (isActive) { controller?.StopPictureInPicture(); } controller = new AVPictureInPictureController(layer.VideoLayer); controller.Delegate = this; if (isActive) { controller.StartPictureInPicture(); } }; IsSetep = true; }
public bool StartPictureInPicture() { if (!IsSupported() || controller == null) { return(false); } if (controller.PictureInPictureActive) { return(true); } controller.StartPictureInPicture(); return(true); }
void togglePictureInPictureMode(UIButton sender) { // Toggle picture in picture mode. // If active, stop picture in picture and return to inline playback. // If not active, initiate picture in picture. // Both these calls will trigger delegate callbacks which should be used // to set up UI appropriate to the state of the application. if (pictureInPictureController.PictureInPictureActive) { pictureInPictureController.StopPictureInPicture(); } else { pictureInPictureController.StartPictureInPicture(); } }