Как сделать Twilio удаленным просмотром видео TVIVideoView в полноэкранном режиме в iOS

Я использую Twilio для видеовызовов, и он работает нормально, но единственная проблема заключается в невозможности установить полноэкранный режим для удаленного видео. Ниже приведен способ создания удаленной настройки видео с помощью Twilio в их Проект QuickStart.

Версия Xcode: 9.3 Версия Swift: 4.1

func setupRemoteVideoView() {
    // Creating `TVIVideoView` programmatically
    self.remoteView = TVIVideoView.init(frame: CGRect.zero, delegate:self)
    self.view.insertSubview(self.remoteView!, at: 0)

    // `TVIVideoView` supports scaleToFill, scaleAspectFill and scaleAspectFit
    // scaleAspectFit is the default mode when you create `TVIVideoView` programmatically.
    self.remoteView!.contentMode = .scaleAspectFit;

    let centerX = NSLayoutConstraint(item: self.remoteView!,
                                     attribute: NSLayoutAttribute.centerX,
                                     relatedBy: NSLayoutRelation.equal,
                                     toItem: self.view,
                                     attribute: NSLayoutAttribute.centerX,
                                     multiplier: 1,
                                     constant: 0);
    self.view.addConstraint(centerX)
    let centerY = NSLayoutConstraint(item: self.remoteView!,
                                     attribute: NSLayoutAttribute.centerY,
                                     relatedBy: NSLayoutRelation.equal,
                                     toItem: self.view,
                                     attribute: NSLayoutAttribute.centerY,
                                     multiplier: 1,
                                     constant: 0);
    self.view.addConstraint(centerY)
    let width = NSLayoutConstraint(item: self.remoteView!,
                                   attribute: NSLayoutAttribute.width,
                                   relatedBy: NSLayoutRelation.equal,
                                   toItem: self.view,
                                   attribute: NSLayoutAttribute.width,
                                   multiplier: 1,
                                   constant: 0);
    self.view.addConstraint(width)
    let height = NSLayoutConstraint(item: self.remoteView!,
                                    attribute: NSLayoutAttribute.height,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.height,
                                    multiplier: 1,
                                    constant: 0);
    self.view.addConstraint(height)
}

person Asad Jamil    schedule 25.04.2018    source источник
comment
Вам нужно активировать ограничения.   -  person Mozahler    schedule 25.04.2018
comment
У вас есть пример кода для активации ограничений?   -  person Asad Jamil    schedule 25.04.2018


Ответы (1)


Вот ваш код немного прибран:

  func setupRemoteVideoView() {
        // Creating `TVIVideoView` programmatically
        self.remoteView = TVIVideoView.init(frame: CGRect.zero, delegate: self)
        self.view.insertSubview(self.remoteView, at: 0)

        // `TVIVideoView` supports scaleToFill, scaleAspectFill and scaleAspectFit
        // scaleAspectFit is the default mode when you create `TVIVideoView` programmatically.

        self.remoteView.contentMode = .scaleAspectFit
        remoteView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        remoteView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        remoteView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
        remoteView.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
        view.setNeedsLayout()
    }

Вот важные изменения:

    remoteView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    remoteView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    remoteView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
    remoteView.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
    view.setNeedsLayout()

Но поскольку эти изменения настолько велики, я покажу вам, как они вписываются в контроллер представления (это компилируется)

import UIKit

class TVIVideoView: UIView {
    var delegate: UIViewController
    init(frame: CGRect, delegate: UIViewController) {
        self.delegate = delegate
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

class ViewController: UIViewController {
    var remoteView =  UIView()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func setupRemoteVideoView() {
        // Creating `TVIVideoView` programmatically
        self.remoteView = TVIVideoView.init(frame: CGRect.zero, delegate: self)
        self.view.insertSubview(self.remoteView, at: 0)
        // `TVIVideoView` supports scaleToFill, scaleAspectFill and scaleAspectFit
        // scaleAspectFit is the default mode when you create `TVIVideoView` programmatically.
        self.remoteView.contentMode = .scaleAspectFit
        remoteView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        remoteView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        remoteView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
        remoteView.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
        view.setNeedsLayout()
    }
}

Обсуждение:

Проведите небольшое исследование авторазметки. (У Apple есть отличная документация, включая книгу Swift.) Autolayout значительно улучшился с тех пор, как код, предоставленный Twilio, был актуальным. Якоря значительно упрощают процесс. Ключевые моменты, которые следует помнить при использовании автоматической компоновки:

  • представление должно быть добавлено к родителю
  • вы должны активировать ограничения
  • должно быть достаточно ограничений, чтобы система вычислила высоту, ширину и начальную точку. (простой способ запомнить это состоит в том, что ваши ограничения в конечном итоге превращаются во фрейм (CGRect) системой

    -- Я немного упрощаю, но суть в том. Если что-то из этого неясно, дайте мне знать, и я отредактирую свой ответ. ????

person Mozahler    schedule 25.04.2018
comment
Я попробовал ваш фрагмент кода, но проблема все еще существует. Я хочу сделать удаленный экран полным. Я прилагаю изображение, чтобы дать вам лучшее понимание. - person Asad Jamil; 25.04.2018
comment
Я хочу сделать этот удаленный раздел видео на весь экран dropbox.com /s/pz1fe5saolisx1y/IMG_1472-2.PNG?dl=0 - person Asad Jamil; 25.04.2018
comment
Я также попытался изменить этот self.remoteView!.contentMode = .scaleAspectFit на self.remoteView!.contentMode = .scaleAspectFill, но он пикселизирует изображение/видео. - person Asad Jamil; 25.04.2018
comment
Зачем отрицать мою попытку помочь объяснить концепции тому, кто заинтересован в обучении? смш - person Mozahler; 31.03.2019
comment
Где? Последнее изменение, которое я вижу, датируется апрелем 2018 года. ???? - person Mozahler; 20.07.2019