2013-10-18 5 views
6

UIDocumentInteractionControllerは、特に横向きの新しいiOS 7ステータスバーと正しく対話するのに問題があるようです。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; 
} 

ステータスバーが最初に表示されると、ステータスバーがタイトルと重なって表示されます。反対側の風景に回転

enter image description here

は一時的に動作を修正します。

enter image description here

自体がフレームを閉じることができ、文書をタップ予想通り。しかしながら、文書をもう一度タップしてフレームをアクティブにすると、第1の画像と同様にオーバーラップが再び生じる。

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

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

対話コントローラが起動したとき、私は、ステータスバーを非表示にしたくないと私は、メールアプリが正常に動作し、それが同じクラスを使用しているように見えるので、正しく、これを行うことが可能であると仮定します。

コードでプレイしたい人のため付属の最小限のプロジェクト例: https://hostr.co/PiluL1VSToVt

+0

iOS 7のバグですか?新しいソリューションはありますか?私は同じ方法で問題を解決しましたが、私のアプリケーションには別のバグがありました。 – GxocT

答えて

0

私はUINavigationControllerUIDocumentInteractionControllerをラッピングし、プレゼンテーションのためのナビゲーションコントローラにアプリケーションウィンドウのルートビューコントローラを切り替えることによって、これを解決しました。

#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 

ダミービューコントローラは、(戻るボタン)の相互作用コントローラがポップすることができます:私の使い方では、他のビューコントローラは、私たちが戻って古いルートコントローラを交換解任したときはそうUINavigationControllerを使用していませんでした。

0

新しいソリューションが見つかりました。 Info.plistファイルで

iOSの7のためにこれを追加します。 UIViewControllerBasedStatusBarAppearance(ビューコントローラベースのステータスバーの外観)= NO

0

これらのソリューションは私のために動作しませんでした。

- (UIViewController *) documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *) controller { 
    // hack to keep status bar visible 
    [[NSOperationQueue mainQueue] addOperationWithBlock: 
    ^{ 
     [[UIApplication sharedApplication] setStatusBarHidden:NO]; 
    }]; 
    return self.viewController; 
} 
0

それは私のために動作するコードの下には試してみてください:

- (void)documentInteractionControllerWillBeginPreview:(UIDocumentInteractionController *)controller 
{ 
    [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
} 

- (void)documentInteractionControllerDidEndPreview:(UIDocumentInteractionController *)controller 
{ 
    [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
} 
を私が見つけた唯一の解決策は提示ビューコントローラ(UIViewControllerBasedStatusBarAppearanceもNOに設定する必要がある)を要求するデリゲート後の次の実行ループに見えるステータスバーを強制することでした
関連する問題