在不需要部署到设备上的情况下,有没有办法在模拟器中测试iPhone相机?这种方式似乎非常繁琐。
在不需要部署到设备上的情况下,有没有办法在模拟器中测试iPhone相机?这种方式似乎非常繁琐。
有一些设备特定的功能需要在设备上进行测试,但使用模拟器并不比它更困难。只需为设备构建一个调试目标并将其连接到计算机即可。
需要真实设备才能执行的操作列表:
我需要测试一些自定义照片叠加效果。这些叠加效果需要根据图像的大小/分辨率进行调整。
我采用了类似于Stefan的建议的方法,决定编写一个“虚拟”相机响应程序。
当模拟器运行时,我执行这个虚拟代码,而不是标准的“captureStillImageAsynchronouslyFromConnection”代码。
在这个虚拟代码中,我构建了一个必要分辨率的“黑色照片”,然后将其通过管道发送,以便像普通照片一样处理。实质上提供了非常快速相机的感觉。
CGSize sz = UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]) ? CGSizeMake(2448, 3264) : CGSizeMake(3264, 2448);
UIGraphicsBeginImageContextWithOptions(sz, YES, 1);
[[UIColor blackColor] setFill];
UIRectFill(CGRectMake(0, 0, sz.width, sz.height));
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
访问相机的常见原因是为了在AppStore中制作屏幕截图。
由于模拟器中没有相机,一个好的技巧(我所知道的唯一一个)是将你的视图调整到所需的大小,仅用于拍摄屏幕截图。稍后可以裁剪它们。
当然,你需要有具有更大屏幕的设备可用。
iPad非常适合测试布局并为所有设备制作快照。iPhone6+的截图必须略微拉伸(按比例缩放为1.078125 - 没有太大问题...)
查看iOS设备分辨率快速参考的好网站: http://www.iosres.com/
编辑:在最近的一个项目中,我使用了自定义相机视图控制器,将AVPreview替换为UIImageView,用于仅在模拟器中运行的目标。这样,我可以自动化iTunesConnect上传的截屏。请注意,相机控制按钮不在叠加层中,而是在相机预览上方的视图中。
@Craig下面的答案描述了另一种方法,我觉得非常聪明 - 它也适用于相机叠加层,与我的方法相反。
我编写了一个替代视图,在调试模式下使用。它实现了相同的 API 并进行相同的委托回调。在我的情况下,我让它从我的测试集中返回一个随机图像。编写起来非常简单。
另一种选择是,在macOS 13+(也许是macOS 12)和Xcode 14+上,通过“我的Mac(专为iPhone设计)”Xcode目标运行iPhone应用程序。
"捕获并保存照片" Swift Playground提供了iOS示例代码,使用了macOS实时摄像头。
_注意:arm64 Mac可以直接运行“我的Mac(适用于iPhone)”。但是,x86_64需要使用“Mac(Mac Catalyst)”才能使用基于iOS的API调用来使用实时摄像头。