尝试在iPad上展示后置摄像头时应用程序冻结

时间:2016-12-21 06:33:50

标签: ios swift ipad camera

我正在开发的应用程序可在iPhone和iPhone上运行。 iPad。应用程序具有的功能之一是从相机捕获图像。我正在使用UIImagePickerController来实现此功能。这是我的代码块;

self.imagePicker.sourceType = .camera            
self.imagePicker.cameraCaptureMode = .photo
self.present(self.imagePicker, animated: true, completion: nil)

该应用程序按照iPhone设计的方式工作,当我在iPad上运行相同的代码时应用程序冻结。此问题仅发生在iPad中,但仅适用于后置摄像头。如果我从图像选择器中选择前置摄像头,应用程序会启动摄像头,但是当按下开关摄像头按钮时会冻结。

据我所知,当应用程序试图绘制相机时会出现日志问题。

日志:

2016-12-20 20:10:33.708816 Ronin[681:148977] CGContextAddPath: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
Dec 20 20:10:33  Ronin[681] <Error>: CGContextAddPath: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
2016-12-20 20:10:33.708925 Ronin[681:148977] clip: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
Dec 20 20:10:33  Ronin[681] <Error>: clip: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
2016-12-20 20:10:33.708991 Ronin[681:148977] CGContextSetFillColorWithColor: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
Dec 20 20:10:33  Ronin[681] <Error>: CGContextSetFillColorWithColor: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
2016-12-20 20:10:33.709047 Ronin[681:148977] CGContextFillRects: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
Dec 20 20:10:33  Ronin[681] <Error>: CGContextFillRects: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.

我用于测试的iPad是:iPad Air 2 - iOS 10.2

修改

UIImagePickerController.isSourceTypeAvailable(.camera)代码块为我的测试用例返回true。我已经添加了这个控件,但之前没有提到过。

我也注意到,当应用程序被冻结时,内存消耗开始增加,同时应用程序崩溃是因为使用了太多内存。

此外,我创建了一个空项目并实现了捕获图像的相同方法,该方法在空项目中设计。在这一点上,我认为这个问题可能与某些项目设置有关。

编辑 - 2

我为CGPostError添加了符号断点,这里是stacktrace:

enter image description here

似乎发送到UIProgressView的无效上下文是导致问题的原因。

任何帮助将不胜感激。

编辑 - 3

正如我之前提到的,我检查了代码块中的 UIImagePickerController.isSourceTypeAvailable(.camera),问题与相机可用性无关。当我以模态方式呈现它时,相机也可以作为弹出窗口。

4 个答案:

答案 0 :(得分:5)

您应该检查相机是否可用:

if UIImagePickerController.isSourceTypeAvailable(.camera) {
    // Implement UIImagePickerController
} else {
    // Show error message
}

答案 1 :(得分:3)

最后我解决了这个问题,

我为所有应用程序实现了一个主题方法。在我的AppDelegate文件中,我在初始化应用程序时设置了用户界面设置。

这是问题,

在相机用户界面中有一个UISlider,这个滑块视图在iPad后置摄像头中始终可见,但在iPhone中只有在使用缩放时才能看到。

    UISlider.appearance().minimumTrackTintColor = themeUI.PrimaryColor.withAlphaComponent(100)
    UISlider.appearance().thumbTintColor = themeUI.PrimaryColor

这两行改变了应用程序中所有滑块的外观,这意味着它还会更改相机滑块的UI。

正如您在我拍摄的屏幕截图中看到的那样,同时绘制相机CoreGraphics库调用

    [UISlider setMinimumTrackTintColor];

以某种方式为滑块设置minimumTrackTintColor会导致无效的上下文错误。

另外设置thumTintColor工作正常,它也改变了相机中UISlider的拇指颜色:)

也许这个问题与Swift 3有关,我会报告一个错误,我们会看到:)

答案 2 :(得分:1)

以下是设置环境变量的方法:https://stackoverflow.com/a/31874419/3724800

以下是我用于在通用应用中打开相机的代码:

if UIImagePickerController.isSourceTypeAvailable(.camera) {
            let imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = .camera;
            imagePicker.allowsEditing = false
            present(imagePicker, animated: true, completion: nil)
}

答案 3 :(得分:1)

用以下代码替换您的代码:

Swift 3

   if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera)
    {
        let imagePicker:UIImagePickerController = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = UIImagePickerControllerSourceType.camera
        imagePicker.allowsEditing = true
        self.present(imagePicker, animated: true, completion: nil)
    }
    else
    {
        let alert:UIAlertController = UIAlertController(title: "Camera not available", message: "Unable to find a camera on this device", preferredStyle: UIAlertControllerStyle.alert)
        self.present(alert, animated: true, completion: nil)
    }

Swift 2

    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera)
     {
          let imagePicker:UIImagePickerController = UIImagePickerController()
          imagePicker.delegate = self
          imagePicker.sourceType = UIImagePickerControllerSourceType.Camera
          imagePicker.allowsEditing = true
         self.presentViewController(imagePicker, animated: true, completion: nil)
     }
     else
     {
          let alert:UIAlertController = UIAlertController(title: "Camera not available", message: "Unable to find a camera on this device", preferredStyle: UIAlertControllerStyle.Alert)
          self.presentViewController(alert, animated: true, completion: nil)
     }