В 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 секунды.Как я могу это сделать?
Третий вопрос: Вторая страница идет снизу после того, как я нажимаю кнопку на первой странице.Может ли вторая страница иметь анимацию исчезновения первой страницы и появления анимации второй страницы?
Важные сведения: Видео должно останавливаться после сворачивания приложения и продолжаться после того, как приложение развернуто пользователем.И еще одна важная деталь: кнопки не находятся внутри просмотра видео.Пользователь может видеть кнопки над видео таким образом.Позвольте мне показать слои для компонентов в порядке с изображением: