Как я могу показывать одно и то же видео в качестве фона на всех контроллерах представления без прерывания во время перехода страниц? - PullRequest
1 голос
/ 27 сентября 2019

В Main.storyboard есть 2 страницы (ViewController): HomeViewController и DetailViewController

Я дал идентификатор раскадровки для DetailViewController: DetailPage

Я добавил кнопку на первую страницу, чтобы перевести пользователя на вторую страницу.

Я также добавил кнопку «Назад» на вторую страницу, чтобы вернуть пользователя на первую страницу.

Мне нужно показать видео в фоновом режиме на всех страницах.

Поэтому я добавил компонент UIView на все страницы, чтобы показать видео.

Я дал 0,0,0,0 значений ограничений для этих 2 компонентов UIView на каждой странице.

Сначала позвольте мнеподелиться исходными кодами, а затем я хотел бы задать свои вопросы.

HomeViewController.swift файл

import UIKit
import AVFoundation

class HomeViewController: UIViewController {

private var player: AVPlayer!

@IBOutlet weak var outlet4TheVideoUiView: UIView!
override func viewDidLoad() {
    super.viewDidLoad()
    configureVideoIssue()
}

override func viewWillAppear(_ animated: Bool) {
    configureVideoIssue()
}

func configureVideoIssue()
{
    // BACKGROUND VIDEO SCOPE STARTS
    let path  = URL(fileURLWithPath: Bundle.main.path(forResource: "clouds", ofType: "mp4")!)
    let player = AVPlayer(url: path)
    self.player = player
    let newLayer = AVPlayerLayer(player: player)

    newLayer.frame = self.view.bounds
    outlet4TheVideoUiView.frame = self.view.bounds
    outlet4TheVideoUiView.layer.addSublayer(newLayer)

    newLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill

    player.play()

    // video bitince tekrar oynatmak için
    player.actionAtItemEnd = AVPlayer.ActionAtItemEnd.none

    NotificationCenter.default.addObserver(self, selector: #selector(self.videoDidPlayToEnd(notification:)),
                                           name: NSNotification.Name(rawValue: "AVPlayerItemDidPlayToEndTimeNotification"), object: player.currentItem)

    NotificationCenter.default.addObserver(self, selector: #selector(enteredBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(enteredForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
    // BACKGROUND VIDEO SCOPE ENDS
}

@objc func enteredBackground() {
    player.pause()
}

@objc func enteredForeground() {
    player.play()
}

@objc func videoDidPlayToEnd(notification: Notification)
{
    let player: AVPlayerItem = notification.object as! AVPlayerItem
    player.seek(to: .zero, completionHandler: nil)
}

@IBAction func linkBtnClick(_ sender: UIButton) {
    let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "DetailPage") as! DetailViewController
    controller.modalPresentationStyle = .fullScreen
    //present(controller, animated: true, completion: nil)
    show(controller, sender: nil)
}
}

DetailViewController.swift файл

import UIKit
import AVFoundation

class DetailViewController: UIViewController {

private var player: AVPlayer!

@IBOutlet weak var outlet4TheVideoUiView: UIView!
override func viewDidLoad() {
    super.viewDidLoad()
    configureVideoIssue()
    // Do any additional setup after loading the view.
}

func configureVideoIssue()
{
    // BACKGROUND VIDEO SCOPE STARTS
    let path  = URL(fileURLWithPath: Bundle.main.path(forResource: "clouds", ofType: "mp4")!)
    let player = AVPlayer(url: path)
    self.player = player
    let newLayer = AVPlayerLayer(player: player)

    newLayer.frame = self.view.bounds
    outlet4TheVideoUiView.frame = self.view.bounds
    outlet4TheVideoUiView.layer.addSublayer(newLayer)

    newLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill

    player.play()

    // video bitince tekrar oynatmak için
    player.actionAtItemEnd = AVPlayer.ActionAtItemEnd.none

    NotificationCenter.default.addObserver(self, selector: #selector(self.videoDidPlayToEnd(notification:)),
                                           name: NSNotification.Name(rawValue: "AVPlayerItemDidPlayToEndTimeNotification"), object: player.currentItem)

    NotificationCenter.default.addObserver(self, selector: #selector(enteredBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(enteredForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
    // BACKGROUND VIDEO SCOPE ENDS
}

@objc func enteredBackground() {
    player.pause()
}

@objc func enteredForeground() {
    player.play()
}

@objc func videoDidPlayToEnd(notification: Notification)
{
    let player: AVPlayerItem = notification.object as! AVPlayerItem
    player.seek(to: .zero, completionHandler: nil)
}

@IBAction func btnBackClick(_ sender: UIButton) {
    dismiss(animated: true, completion: nil)
}
}

Первый вопрос: Я уверен, что так не должно быть, потому что одинаковые коды написаны в обоих ViewControllers.Так как я могу избежать этого?Какие-либо предложения?Я должен использовать один и тот же объект просмотра видео в качестве фона для всех контроллеров представления.Имеет ли это смысл?Если это не имеет смысла.Что я должен делать?Например, я использую компонент asp.net user control в Visual Studio для этого сценария.Я создаю один компонент видео (пользовательский контроль), и я могу использовать этот компонент для всех страниц в качестве фона.

Второй вопрос: (если мы не можем найти решение первого вопроса) Предположим, что пользователь приложения видит домашнюю страницу прямо сейчас.И давайте предположим, что пользователь нажимает кнопку, чтобы увидеть вторую страницу (страницу сведений) через 10 секунд.Действие нажатия кнопки переносит пользователя на вторую страницу, но видео начинается с первой секунды.Видео должно продолжаться с 10 секунды или 11 секунды.Как я могу это сделать?

Третий вопрос: Вторая страница идет снизу после того, как я нажимаю кнопку на первой странице.Может ли вторая страница иметь анимацию исчезновения первой страницы и появления анимации второй страницы?

Важные сведения: Видео должно останавливаться после сворачивания приложения и продолжаться после того, как приложение развернуто пользователем.И еще одна важная деталь: кнопки не находятся внутри просмотра видео.Пользователь может видеть кнопки над видео таким образом.Позвольте мне показать слои для компонентов в порядке с изображением:

enter image description here

1 Ответ

1 голос
/ 27 сентября 2019

Один из способов сделать это - установить вид на rootWindow, а затем установить цвет фона всех видов на *. 1002 *

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.

    let window=self.window!
    backgroundVideoView.bounds = window.bounds
    window.addSubview(backgroundVideoView)
    playVideo()

    return true
}

Здесь backgroundVideoView относится к виду, которыйбудет воспроизводить ваше видео.

Хотя, я должен предупредить вас, это потребует много памяти, но даст вам желаемое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...