UipageViewController 带有自定义控件的UIImagePicker无法正常工作 - 视图不在窗口层次



我正在尝试创建类似于swift中的snapchat的效果 - 用自定义控件和其他VC在 uiimagePicker 之间划过。

问题是:

  • cameravc 首次出现在背景中,而VC之间的滑动仅在控件上(在不应该从相机上进行图像的空空间)起作用,并且警告显示向上"尝试在Cameravc上呈现UIimagePickerController,其视图不在窗口层次结构中!"

  • 当我滑动到另一个VC时,然后返回 cameravc uiimagePicker的呈现正确,并且一切正常,而不是在无效的VC之间进行刷卡。也没有"窗口层次结构"警告

所以我认为它不起作用的原因是 uiimagePicker 正在通过 pageviewController 而不是"它"中的"它",但我不知道如何解决此问题。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</p>

我正在介绍 pageViewController 这样:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    var vcPageView = storyboard.instantiateViewControllerWithIdentifier("PageViewID") as! UIViewController
    self.presentViewController(vcPageView, animated: false, completion: nil)    
}

将VC加载到 pageViewController 中的表格中:

override func viewDidLoad() {
    super.viewDidLoad()
    self.delegate = self
    self.dataSource = self
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    var vc0 = storyboard.instantiateViewControllerWithIdentifier("CameraID") as! UIViewController
    var vc1 = storyboard.instantiateViewControllerWithIdentifier("vc2ID") as! UIViewController
    self.myViewControllers = [vc0, vc1]
    self.setViewControllers([myViewControllers[0]], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
}

和最后 cameravc

@IBOutlet var cameraOverlay: UIView!
var camera = UIImagePickerController()
override func viewDidLoad() {
    super.viewDidLoad()  
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera){

        self.camera.delegate = self
        self.camera.sourceType = UIImagePickerControllerSourceType.Camera;
        self.camera.mediaTypes = [kUTTypeImage]
        self.camera.allowsEditing = false
        self.camera.showsCameraControls = false
        self.cameraOverlay.frame = self.camera.cameraOverlayView!.frame
        self.cameraOverlay.bringSubviewToFront(self.cameraOverlay)
        self.camera.cameraOverlayView = self.cameraOverlay
        self.cameraOverlay = nil
    }
}
override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    self.topMostViewController().presentViewController(self.camera, animated: false, completion: nil)
}

topertviewController 代码:

extension UIViewController {
func topMostViewController() -> UIViewController {
    // Handling Modal views
    if let presentedViewController = self.presentedViewController {
        return presentedViewController.topMostViewController()
    }
        // Handling UIViewController's added as subviews to some other views.
    else {
        for view in self.view.subviews
        {
            // Key property which most of us are unaware of / rarely use.
            if let subViewController = view.nextResponder() {
                if subViewController is UIViewController {
                    let viewController = subViewController as! UIViewController
                    return viewController.topMostViewController()
                }
            }
        }
        return self
    }
}

尝试一下,在cameravc中,将viewDidLoad()中的相机代码移至viewDidAppear()

最新更新