小编Ryu*_*ora的帖子

在iOS上设置初始焦距

我正在开发一个iOS应用程序,其中一项功能是扫描QR码.为此,我使用了优秀的图书馆ZBar.扫描工作正常,通常很快.但是,当您使用较小的QR码时,扫描需要更长的时间,主要是因为自动对焦需要一些时间来调整.我正在尝试并注意到可以使用以下代码锁定焦点:

AVCaptureDevice *cameraDevice = readerView.device;
if ([cameraDevice lockForConfiguration:nil]) {
     [cameraDevice setFocusMode:AVCaptureFocusModeLocked];
     [cameraDevice unlockForConfiguration];
}
Run Code Online (Sandbox Code Playgroud)

在成功扫描后使用此代码时,即将进行的扫描非常快.这让我很奇怪,在扫描一个代码之前,我能以某种方式锁定焦点吗?该应用程序将只扫描相当小的QR码,因此永远不需要专注于远处的东西.当然,我可以实现像tap一样专注的东西,但最好是我想避免这个额外的步骤.有没有办法实现这个目标?或者,在处理较小的QR码时,是否有其他方法可以加快速度?

//亚历山大

camera focus qr-code ios

18
推荐指数
2
解决办法
8519
查看次数

在iOS 6及更高版本中手动调用状态保留

一些背景

我正在开发一个iOS应用程序,我们希望保留应用程序的状态.
在此应用程序发布之前,iOS 7很可能已经发布或即将发布,而且大多数似乎已经从iOS 5发布.因此,我们决定开发iOS 6.

在iOS 6中,有一些非常好的功能可以保存状态.只需在storyboard中提供所有视图的唯一ID,并在"AppDelegate"中实现这两个功能:

- (BOOL)application:(UIApplication*)application shouldSaveApplicationState:(NSCoder*)coder;
- (BOOL)application:(UIApplication*)application shouldRestoreApplicationState:(NSCoder*)coder;
Run Code Online (Sandbox Code Playgroud)

然后,iOS将"自动"保留应用程序的导航历史记录.方法:

- (void)encodeRestorableStateWithCoder:(NSCoder*)coder;
- (void)decodeRestorableStateWithCoder:(NSCoder*)coder;
Run Code Online (Sandbox Code Playgroud)

然后可以用于存储和检索数据.
它没有问题,没有问题.但是,只有在应用程序进入后台时才会触发保存状态的方法.

假设我们有一个带有四个ViewControllers的NavigationController:A,B,C和D.用户从A导航到B,在B中他切换到Safari来google.应用程序状态保存在B.然后用户切换回应用程序并导航到C然后导航到D.在D中,应用程序不幸遇到异常并且关闭.当用户重新启动应用程序时,iOS将尝试恢复已保存的状态.然而,这个状态保存在B中.这意味着当应用程序启动时,它不会从头开始,而不是用户离开它的地方(D),甚至不是前一个视图(C),而是在B.

可能的解决方案

如果应用程序在每个新视图中保存其状态,则可以避免上述情况.但是,据我所知,没有任何公共方法可以触发状态保存过程.我在调试时检查了调用堆栈,发现iOS在iOS 6中的UIApplication对象上调用了以下方法:

_saveApplicationPreservationState:
Run Code Online (Sandbox Code Playgroud)

以及iOS 7中的以下方法:

_saveApplicationPreservationState:viewController:sessionIdentifier:beginHandler:completionHandler:
Run Code Online (Sandbox Code Playgroud)

似乎还有另一种方法根据iOS版本调用上述方法之一:

_saveApplicationPreservationStateIfSupported
Run Code Online (Sandbox Code Playgroud)

通过调用此方法,如下所示:

    if ([[UIApplication sharedApplication] respondsToSelector:@selector(_saveApplicationPreservationStateIfSupported)])
        [[UIApplication sharedApplication] performSelector:@selector(_saveApplicationPreservationStateIfSupported)];
Run Code Online (Sandbox Code Playgroud)

我可以看到调用了预期的方法.

实际的问题

如果我使用上述解决方案可以让我的应用程序被拒绝从App Store?我的意思是技术上它不是一种私人方法,它只是没有暴露.通过将调用包装在"respondsToSelector"中,如果API被更改,应用程序将不会崩溃,它只是不会经常保存状态.但如果它可以让应用程序被拒绝,那么这不是一个选择.或者除了上面描述的那个之外还有其他任何手动调用状态保存过程的方法吗?我很高兴能够使用内置功能,而不是构建一个保存状态的自定义解决方案NSUserDefaults.

objective-c ios

18
推荐指数
1
解决办法
951
查看次数

标签 统计

ios ×2

camera ×1

focus ×1

objective-c ×1

qr-code ×1