2013-10-18 17 views
6

Die UIDocumentInteractionController scheint Probleme bei der Interaktion mit der neuen iOS 7-Statusleiste, insbesondere im Querformat, zu haben. Der Code, den ich zur sofortigen Anzeige des Viewers habe:Document Interaction Controller mit iOS 7 Statusleiste?

- (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; 
} 

Wenn der Interaktionskontroller zum ersten Mal erscheint, überlappt die Statusleiste den Titel.

enter image description here

auf der anderen Seite zu Landschaft Rotierende behebt das Verhalten vorübergehend.

enter image description here

Wie auf dem Dokument erwartet Klopfen selbst den Rahmen ermöglicht entlässt. Sobald das Dokument jedoch einmal mehr betätigt wird, um den Rahmen zu aktivieren, tritt die Überlappung wieder auf wie beim ersten Bild.

Ich habe versucht, documentInteractionControllerRectForPreview vergebens.

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

Ich möchte nicht auf die Statusleiste auszublenden, wenn die Interaktion Controller aufgeht und ich nehme an, es möglich ist, diese richtig zu tun, da die Mail-App korrekt verhält und es sieht aus wie es die gleiche Klasse verwendet.

Ein minimales Beispielprojekt für jedermann angebracht, die mit dem Code spielen wollen: https://hostr.co/PiluL1VSToVt

+0

Ist es ein Fehler in iOS 7? Gibt es neue Lösungen? Ich habe den gleichen Weg benutzt, um das Problem zu lösen, aber es verursachte einen weiteren Fehler in meiner Anwendung. – GxocT

Antwort

0

ich dies durch Umwickeln für die Präsentation der UIDocumentInteractionController in einem UINavigationController und Umschalten des Anwendungsfensters Root-View-Controller an die Navigationssteuerung gelöst. In meiner Nutzung der anderen Ansicht-Controller wurden nicht mit UINavigationController so bei Entlassung tauschen wir die alten Root-Controller zurück:

#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 

Die Dummy-View-Controller ermöglichen die Interaktion Controller geknallt wird (Back-Button).

0

Neue Lösung gefunden.

In info.plist Datei hinzufügen, das für iOS 7: UIViewControllerBasedStatusBarAppearance (View-Controller-basierte Statusleiste Aussehen) = NO

0

Diese Lösungen nicht für mich arbeiten. Die einzige Lösung fand ich war auf Statusleiste sichtbar auf der nächsten Runloop nach Delegat zu zwingen, den präsentierenden View-Controller anfordert (müssen UIViewControllerBasedStatusBarAppearance auf NO auch):

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

Versuchen Below-Code funktioniert es für mich:

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

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