自定义控件不起作用的UIPageViewController + UIImagePicker - 视图不在窗口层次结构中

时间:2015-05-13 17:06:04

标签: ios swift uiviewcontroller uiimagepickercontroller uipageviewcontroller

我尝试在Swift中创建类似于Snapchat的效果 - 使用自定义控件和其他VC在 UIImagePicker 之间轻扫。

问题是:

  • 当第一次出现 CameraVC 背景为黑色时,VC之间的滑动仅适用于控件(在空白区域,应该是来自相机的图像,它不是&t;)警告显示"尝试在CameraVC上显示UIImagePickerController,其视图不在窗口层次结构中!"

  • 当我滑动到另一个VC然后再回到 CameraVC 时,UIImagePicker正确显示,一切正常,而不是在VC之间滑动,而根本不起作用。还没有"窗口层次"警告

所以我认为它不起作用的原因是 UIImagePicker 通过 PageViewController 而不是"在"它,但我不知道如何解决这个问题。

我像这样展示 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)
}

topMostViewController 代码:

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
    }
}

1 个答案:

答案 0 :(得分:-2)

试试这个,在CameraVC中将viewDidLoad()中的相机代码移动到viewDidAppear()