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

Yiğ*_*lik 7 camera ipad ios swift

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

self.imagePicker.sourceType = .camera            
self.imagePicker.cameraCaptureMode = .photo
self.present(self.imagePicker, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

该应用程序的工作原理是它在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.
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

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

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

编辑 - 2

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

在此输入图像描述

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

任何帮助将不胜感激.

编辑 - 3

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

Yiğ*_*lik 6

终于我解决了这个问题,

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

这是问题

相机UI中有一个UISlider,此滑块视图在iPad后置相机中始终可见,但在iPhone中,仅当您使用缩放时才可见。

    UISlider.appearance().minimumTrackTintColor = themeUI.PrimaryColor.withAlphaComponent(100)
    UISlider.appearance().thumbTintColor = themeUI.PrimaryColor
Run Code Online (Sandbox Code Playgroud)

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

如您所见,我在绘制相机CoreGraphics库调用时授予的屏幕截图

    [UISlider setMinimumTrackTintColor];
Run Code Online (Sandbox Code Playgroud)

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

另外设置thumTintColor可以正常工作,它也可以更改Camera中UISlider的拇指颜色:)

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


nyn*_*ohu 5

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

if UIImagePickerController.isSourceTypeAvailable(.camera) {
    // Implement UIImagePickerController
} else {
    // Show error message
}
Run Code Online (Sandbox Code Playgroud)