10

UIDocumentInteractionController が閉じられると、UINavigationController の要素を含む、表示中のビュー コントローラーのビューが削除されます。

UIDocumentInteractionController が閉じられ、表示側のビュー コントローラーのビューが削除され、表示側のビュー コントローラーが以前存在していた白/灰色のボックスが残ります。この時点以降、アプリはタッチ イベントに応答しなくなります。

これは、Quick Look Pdf Reader の iOS 7 を実行している iPad シミュレーター (iOS 7.0) および iPad 3 (Wifi) で発生します。

アプリケーションが iOS 6.1 または iOS 7 SDK に対してコンパイルされたかどうかは関係ありません

あなたの提案を教えてください。

4

3 に答える 3

2

Michael Kuntscher の回答が的を射ていることがわかりました。UIDocumentInteractionController がポップオーバーから表示される場合は、わずかな変更が必要です。

UIWindow スーパービューを持つビューが見つかるまで、親ビューを反復処理することで排除できる、ビュー階層へのわずかな依存があります。さらに、ドキュメント インタラクション コントローラーがポップオーバー内から表示される場合、parentView および containerView として保存する必要があるのは、わずかに異なるビューであることがわかりました (具体的には、そのスーパービューが UIPopoverView になるような containerView を見つけたいと考えています)。次のスニペットは、これらの変更を組み込むために Michael の回答を作り直したバージョンです (UIPopoverView はプライベート クラスであるため、各クラスを直接参照するのではなく、クラスの文字列表現を使用することに注意してください)。

- (void)documentInteractionControllerWillBeginPreview:(UIDocumentInteractionController *)controller {

    /* iOS 7 DIC bug workaround  */
    if (UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM()) {
        UIView *a_view = self.view;

        self.dicParentView = nil;
        self.dicContainerView = nil;

        while (a_view != nil) {
            UIView *super_super_view = [[a_view superview] superview];
            NSString *str_class = NSStringFromClass([super_super_view class]);

            if ([str_class isEqualToString:@"UIWindow"] ||
                [str_class hasSuffix:@"PopoverView"]) {
                self.dicParentView = a_view;
                self.dicContainerView = [a_view superview];
                break;
            }
            a_view = [a_view superview];
        }

        if (self.dicParentView == nil) {
            NSLog(@"Could not appropriate superview, unable to workaround DIC bug");
        }
    }
    /* end work around */
}

- (void)documentInteractionControllerDidEndPreview:(__unused UIDocumentInteractionController *)controller {
    /* iOS 7 DIC bug workaround */
    if (UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM()) {
        if ((self.view.window == nil) &&
            (self.dicContainerView != nil) &&
            (self.dicParentView != nil)) {
            NSLog(@"Restoring view for DIC presenter in the view hierarchy");
            CGRect frame = self.dicParentView.frame;
            frame.origin = CGPointZero;
            self.dicParentView.frame = frame;
            [self.dicContainerView addSubview: self.dicParentView];
            self.dicContainerView = nil;
            self.dicParentView = nil;
        }
    }
    /* end work around */
}
于 2013-12-11T16:09:21.987 に答える
0

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 バージョンの動作には影響しません。

于 2014-02-25T05:56:19.273 に答える