Активная навигация пользовательского интерфейса в представлении под popover - PullRequest
0 голосов
/ 21 мая 2018

У меня есть пользовательский интерфейс, где SCNView находится в фоновом режиме, а WKWebView на переднем плане представлен как .popover.Представления контролируются отдельными контроллерами представления.WKWebView появляется, когда пользователь нажимает кнопку (см. Прикрепленный экран).В SCNView включено стандартное управление камерой.

В настоящее время, когда появляется всплывающее окно WKWebView, SCNView перестает отвечать на запросы.Жест касания вне WKWebView закрывает его, другие жесты игнорируются, поэтому пользователь не может управлять камерой SCNView, пока отображается всплывающее окно WKWebView. Как я могу сделать SCNView отзывчивым, пока присутствует поповер WKWebVIew?Как я могу закрыть WKWebView, только когда нажата кнопка звонка ?

App view - WKWebView in the front makes SCNView in the back unresponsive. How can I control SCNView camera while WKWebView is present?

Код, используемый ниже:

class MainVC: UIViewController, UIPopoverPresentationControllerDelegate {
    @IBOutlet weak var scnView: SCNView!
    @IBOutlet weak var bellBtn: UIButton!
    var myWebViewVC: MyWebViewVC!    
    override func viewDidLoad() {
        super.viewDidLoad()
        let scene = SCNScene(named: "art.scnassets/DemoScene.scn")!
        let scnView = sceneView
        scnView!.scene = scene
        scnView!.allowsCameraControl = true
    }
    @IBAction func onBellBtnPressed(_ sender: UIButton) {
        myWebViewVC.modalPresentationStyle = .popover
        myWebViewVC.popoverPresentationController?.delegate = self
        present(myWebViewVC, animated: true, completion: nil)
        myWebViewVC.popoverPresentationController?.sourceView = sender
        myWebViewVC.popoverPresentationController?.sourceRect = sender.bounds
    }
}

MyWebViewVC заботится только о размере вида.Никаких дополнительных пользовательских модификаций в файле не реализовано.

1 Ответ

0 голосов
/ 04 июня 2018

Хорошо.Таким образом, решение в основном связано с параметром popoverPresentationController контроллера представления.Вот документация .Чтобы включить управление представлением под представлением, представленным как .popover, вам необходимо сообщить ему о представлениях, которые будут отзывчивыми, когда присутствует popover.Порядок прохождения сверху вниз.Код ниже и массив passThrough заставляют его работать.

class MainVC: UIViewController, UIPopoverPresentationControllerDelegate {
    @IBOutlet weak var scnView: SCNView!
    @IBOutlet weak var bellBtn: UIButton!
    @IBOutlet weak var dotBtn: UIButton!
    var myWebViewVC: MyWebViewVC!    
    override func viewDidLoad() {
        super.viewDidLoad()
        let scene = SCNScene(named: "art.scnassets/DemoScene.scn")!
        scnView!.scene = scene
        scnView!.allowsCameraControl = true
    }
    @IBAction func onBellBtnPressed(_ sender: UIButton) {
        activeUiNavigationUnderPopover()
    }
    func activeUiNavigationUnderPopover () {
        myWebViewVC.modalPresentationStyle = .popover
        myWebViewVC.popoverPresentationController?.delegate = self
        if let pop = myWebViewVC.popoverPresentationController {

                var passthroughViews: [AnyObject]?
                    passthroughViews = [dotBtn, scnView]
                    pop.passthroughViews = NSMutableArray(array: passthroughViews!) as? [UIView]
                    pop.permittedArrowDirections = .any
                    pop.delegate = self
        }
        present(myWebViewVC, animated: true, completion: nil) 
        myWebViewVC.popoverPresentationController?.sourceView = sender
        myWebViewVC.popoverPresentationController?.sourceRect = sender.bounds
    }
}
...