UIDocumentInteractionController が表示されて閉じられた後、すべてのコンテンツを失った灰色のフォーム シート モーダル ビューでアプリが停止するというまったく同じ問題がありました。ここでの 2 つのソリューションは優れていますが、特定のケースに対応するために単純化しました。これは、UIDocumentInteractionController で PDF を表示できるフォーム シート モーダル内の UINavigationController でした。ナビゲーション コントローラーにプッシュするのではなく、フルスクリーン モーダルにしたかったのです。フォーム シート領域が小さすぎて、PDF を簡単に読み取ることができないためです。
2 つの UIDocumentInteractionControllerDelegate メソッドを実装しました。次のことを前提とします。
self.navController
フォーム シート モーダル内に表示される UINavigationController への参照です。
- UIViewController サブクラスで宣言されたメンバー変数があります
@property (nonatomic, strong) UIView* docInteractionControllerWorkaroundSuperview;
- SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO
#define
は([[[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
閉じられると、ナビゲーション コントローラーのビューのスーパービューに UITransistionView が表示されます。しかし、その直後 (遷移が完了したとき) に、nil に設定されます。どういうわけか、UIDropShadowView から切り離されました (または再接続されませんでした)。UIDocumentInteractionController を提示するときにこれを表示するための参照を保持することで、手動で再アタッチでき、すべて正常に動作します。次に、誤って参照を保持しないように、必ず参照を nil アウトしてください。
このメソッドは、iOS 6 またはそれ以前の iOS バージョンの動作には影響しません。