7

Ich schiebe ViewControllers auf NavigationController von Segues. Ich habe meine eigene subclasssed NavigationController, die UIImageView bei Index 0 eingefügt hat - es ist ein Hintergrund für meine gesamte Anwendung.Aufrufe werden dunkler, wenn auf Navigationscontroller gedrückt werden

Das Problem ist, dass ich sehen kann, wenn neue Ansicht Controller auf den Bildschirm von der rechten Seite kommt, am Anfang ist es wie etwas dunkles Overlay, die verschwindet, wenn kurz nach viewDidApear aufgerufen wird.

Jeder View-Controller hat eine self.view.backgroundColor = [UIColor clearColor]. Wenn ich es für eine Weile ändere, ist alles in Ordnung. Vielleicht sollte ich Hintergrund der Anwendung auf andere Weise festlegen? Und wenn nicht, wie kann man diesen Darkling-Effekt vermeiden?

Hier haben Sie Screen-Capture mit diesem Effekt: http://tinypic.com/r/34j9ffs/8

+0

Können Sie Code anzeigen ...? Wo stellst du diese Codezeile ein? –

+0

einige Screenshots können hilfreich sein – southpark

+0

ich habe URL zur Bildschirmaufnahme hinzugefügt – krzysiek

Antwort

3

Es ist wegen der Standard UINavigationController Push-Animation in iOS 7. Wenn ein neuer VC auf den Stapel geschoben wird, ist es überlagert sich auf der Oberseite des früheren VC mit einem leichten Schatten darunter. Wenn Sie also Ihre ViewController mit klarem Hintergrund drücken, sehen Sie den Schatten durch, wenn der Übergang stattfindet.

Es gibt ein paar mögliche Lösungen:

  • Legen Sie eine Hintergrundfarbe auf Ihrem Viewcontrollers (wahrscheinlich nicht eine Option für Sie wegen Ihrer globalen Hintergrundbild). Die einfachste Lösung, aber würde eine Änderung an Ihrem Design erfordern.
  • Implementieren Sie Ihren eigenen Übergang mit den neuen iOS 7-APIs. Siehe an example here und einen Artikel von Big Nerd Ranch here. Dies ist wirklich die "richtige" Lösung für Ihr Problem, wenn Sie Ihr Hintergrundbild behalten möchten.
  • Fügen Sie eine UINavigationController Kategorie hinzu, um eine einfachere "Retro" -Push- und Pop-Animation hinzuzufügen, as per this answer. Dies ist eher eine schnelle und hacky Lösung.
+0

Perfekt! Ich habe meinen eigenen Navigations-Controller, also habe ich 'pushViewController: animated:' Methode einfach übersteuert. – krzysiek

0

habe ich eine benutzerdefinierte Push segue, die die Arbeit tun sollten:

ClearBkgPushSegue.h:

#import <UIKit/UIKit.h> 

@interface ClearBkgPushSegue : UIStoryboardSegue 

@end 

ClearBkgPushSegue.m:

#import "ClearBkgPushSegue.h" 

@implementation ClearBkgPushSegue 


-(void)perform { 
    UIViewController *sourceViewController = self.sourceViewController; 
    UIViewController *destinationViewController = self.destinationViewController; 

    CGRect bounds = [[UIScreen mainScreen] bounds]; 
    UIWindow *window = [[[UIApplication sharedApplication] delegate] window]; 

    UIView *destView = destinationViewController.view; 
    [window insertSubview:destinationViewController.view aboveSubview:sourceViewController.view]; 

    destView.frame = CGRectMake(bounds.size.width, destView.frame.origin.y, destView.frame.size.width, destView.frame.size.height); 
    [UIView animateWithDuration:.35 delay:0 options:UIViewAnimationOptionCurveEaseOut 
        animations:^{ 
         destView.frame = sourceViewController.view.frame; 
         sourceViewController.view.frame = CGRectMake([UIScreen mainScreen].bounds.size.width * -0.33, 0.0, sourceViewController.view.frame.size.width, sourceViewController.view.frame.size.height); 
         sourceViewController.view.alpha = 0; 
        } completion:^(BOOL finished) { 
         [sourceViewController.navigationController pushViewController:destinationViewController animated:NO]; 
         sourceViewController.view.alpha = 1; 

    }]; 


} 

@end 

Wählen Sie einfach Ihre segue zu sein "Custom" und wählen Sie diese Klasse und Sie können loslegen.