我正在开发的应用程序可在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:
似乎发送到UIProgressView的无效上下文是导致问题的原因。
任何帮助将不胜感激。
编辑 - 3
正如我之前提到的,我检查了代码块中的 UIImagePickerController.isSourceTypeAvailable(.camera),问题与相机可用性无关。当我以模态方式呈现它时,相机也可以作为弹出窗口。
答案 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)
}