6

UIDocumentInteractionController特に横向きの場合、新しい iOS 7 ステータス バーとの適切なやり取りに問題があるようです。今ビューアを表示するためのコード:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"example" ofType:@"pdf"];
    NSURL *url = [NSURL fileURLWithPath:filePath];

    UIDocumentInteractionController *pdfViewer = [UIDocumentInteractionController interactionControllerWithURL:url];
    [pdfViewer setDelegate:self];
    [pdfViewer presentPreviewAnimated:YES];
}

- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller
{
    return self;
}

- (UIView *)documentInteractionControllerViewForPreview:(UIDocumentInteractionController *)controller
{
    return self.view;
}

インタラクション コントローラーが最初に表示されると、ステータス バーがタイトルに重なって表示されます。

ここに画像の説明を入力

反対側で横向きに回転すると、動作が一時的に修正されます。

ここに画像の説明を入力

予想どおり、ドキュメント自体をタップすると、フレームを閉じることができます。ただし、ドキュメントをもう一度タップしてフレームをアクティブにすると、最初の画像と同様にオーバーラップが再び発生します。

私はdocumentInteractionControllerRectForPreview無駄に設定しようとしました。

- (CGRect)documentInteractionControllerRectForPreview:(UIDocumentInteractionController *)controller
{
    return CGRectMake(0, 20, self.view.bounds.size.width, self.view.bounds.size.height);
}

インタラクション コントローラーが起動したときにステータス バーを非表示にしたくありません。メール アプリは正しく動作し、同じクラスを使用しているように見えるため、これを正しく行うことができると思います。

コードで遊んでみたい人のために添付された最小限のサンプル プロジェクト: https://hostr.co/PiluL1VSToVt

4

4 に答える 4

0

新しい解決策を見つけました。

info.plist ファイルで、iOS 7 用にこれを追加します: UIViewControllerBasedStatusBarAppearance (コントローラーベースのステータスバーの外観を表示) = NO

于 2013-11-22T07:06:54.657 に答える
0

UIDocumentInteractionControllerをaでラップしUINavigationController、アプリケーション ウィンドウのルート ビュー コントローラーをプレゼンテーション用のナビゲーション コントローラーに切り替えることで、これを解決しました。私の使用法では、他のView Controllerは使用していなかっUINavigationControllerたので、却下時に古いルートコントローラーを元に戻します。

#import "MainViewController.h"

@interface MainViewController ()

@property (nonatomic, strong) UINavigationController *navController;
@property (nonatomic, strong) MainViewController *main;

@end

@implementation MainViewController

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    self.main = self;
    self.navController = [[UINavigationController alloc] initWithRootViewController:[UIViewController new]];
    [[UIApplication sharedApplication].keyWindow setRootViewController:self.navController];

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"example" ofType:@"pdf"];
    NSURL *url = [NSURL fileURLWithPath:filePath];

    UIDocumentInteractionController *pdfViewer = [UIDocumentInteractionController interactionControllerWithURL:url];
    [pdfViewer setDelegate:self];
    [pdfViewer presentPreviewAnimated:YES];
}

- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller
{
    return self.navController;
}

- (void)documentInteractionControllerDidEndPreview:(UIDocumentInteractionController *)controller
{
    [[UIApplication sharedApplication].keyWindow setRootViewController:self.main];
    self.main = nil;
}

- (void)dismiss
{
    [self.navController popViewControllerAnimated:YES];
}

@end

ダミー ビュー コントローラーを使用すると、インタラクション コントローラーをポップできます ([戻る] ボタン)。

于 2013-11-05T13:06:44.857 に答える
0

これらの解決策は私にはうまくいきませんでした。私が見つけた唯一の解決策は、デリゲートが提示ビューコントローラーを要求した後、次の実行ループでステータスバーを強制的に表示することでした (UIViewControllerBasedStatusBarAppearance も NO に設定する必要があります)。

- (UIViewController *) documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *) controller {
    // hack to keep status bar visible
    [[NSOperationQueue mainQueue] addOperationWithBlock:
     ^{
         [[UIApplication sharedApplication] setStatusBarHidden:NO];
     }];
    return self.viewController;
}
于 2014-06-27T09:45:36.580 に答える