在呈现和关闭 UIDocumentInteractionController 后,应用程序停止在灰色表单模式视图上丢失了所有内容,我遇到了完全相同的问题。这里的两个解决方案很棒,但我简化了它们以适应我的特殊情况,它是表单模式中的 UINavigationController,可以在 UIDocumentInteractionController 中呈现 PDF,我希望它是全屏模式而不是在导航控制器中推送因为表单区域太小,PDF 难以阅读。
我实现了两个 UIDocumentInteractionControllerDelegate 方法。假设如下:
self.navController
是对 UINavigationController 的引用,显示在表单模式中。
- 在 UIViewController 子类中声明了一个成员变量
@property (nonatomic, strong) UIView* docInteractionControllerWorkaroundSuperview;
#define
SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO是([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
首先:
-(UIViewController*)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController*)controller
{
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0") && self.navigationController.modalPresentationStyle == UIModalPresentationFormSheet)
{
self.docInteractionControllerWorkaroundSuperview = [self.navigationController.view superview];
}
return self.navigationController.visibleViewController;
}
然后:
- (void)documentInteractionControllerDidEndPreview:(UIDocumentInteractionController *)controller
{
if (self.docInteractionControllerWorkaroundSuperview != nil)
{
NSLog(@"Workaround iOS 7 document interaction bug... resetting nav controller view into modal");
//reset the nav controller view from whence it came.
self.navigationController.view.frame = CGRectMake(0.0, 0.0, self.navigationController.view.frame.size.width, self.navigationController.view.frame.size.height);
[self.docInteractionControllerWorkaroundSuperview addSubview:self.navigationController.view];
self.docInteractionControllerWorkaroundSuperview = nil;
}
}
即在呈现 UIDocumentInteractionController 时,查看导航控制器视图的超级视图。它是一个 UIDropShadowView,我假设它是表单模式的部分透明灰色/黑色背景,它使呈现模式的后面的视图变暗。
当 PDF 被关闭时,documentInteractionControllerDidEndPreview
导航控制器视图的超级视图中现在是 UITransitionView。但是在那之后不久(当转换完成时),它被设置为 nil。不知何故,它与 UIDropShadowView 分离(或没有重新连接)。通过在呈现 UIDocumentInteractionController 时保留对视图的引用,我们可以手动重新附加它,一切正常。然后确保取消引用以确保我们不会意外保留它。
此方法不会影响 iOS 6 或任何以前的 iOS 版本上的行为。