Ombra scura sulla barra di navigazione durante la transizione segue dopo l'aggiornamento a Xcode 5.1 e iOS 7.1


91

Quando navigo avanti e indietro tra i controller principale e secondario in un controller di navigazione principale - dettaglio, vedo un'ombra scura sul lato destro della barra di navigazione in alto. È iniziato dopo l'aggiornamento a Xcode 5.1. Sembra ruvido e distrae. Come posso sbarazzarmene?

Risposte:


143
self.navigationController.view.backgroundColor = [UIColor whiteColor];

Ho risolto questo problema impostando il colore di sfondo della vista del controller di navigazione.


Questa risposta è effettivamente molto buona. Per qualche motivo Interface Builder non ti consente di accedere alla visualizzazione del controller di navigazione, ma sembra che una darkColorvisualizzazione sia ancora presente e causa questo problema.
superarts.org

1
Questa è un'ottima risposta perché consente anche alla barra di rimanere traslucida senza mostrare la brutta sezione nera che sanguina dal controller di navigazione. Vorrei solo che ci fosse un modo per impostarlo nello storyboard.
dimiguel

Esattamente. Di tanto in tanto ci penso e rimango un po 'deluso per le altre risposte che suggeriscono di disattivare la trasparenza della barra di navigazione, poiché in pratica stanno risolvendo questo problema disabilitando una funzione, che questa risposta indica la soluzione effettiva. Peccato che questo comportamento rimanga lo stesso in Xcode 7 / iOS 9.
superarts.org

1
Spiacenti, ho downvotato questa risposta perché lo sfondo della finestra non è la causa principale di questo problema. Si prega di vedere il mio screenshot allegato: imgur.com/a/SH5Dp Scoprirai che il problema esiste ancora, l'ombra scura è appena stata sostituita con quella bianca, immagino che il controller dei dettagli sia stato `` ritagliato '' o in qualche modo, fai in modo che non disegna nulla sotto NavBar .
mariotaku

1
tabBarController? .view.backgroundColor = UIColor.white incase se il controller di root è UITabBarController.
Vishal Singh

53
self.navigationController.navigationBar.translucent = NO; 

aggiustato


Dove l'hai posizionato?
Zorayr

Nel metodo ViewDidLoad del controller della vista principale
Nihat

Aggiungi in viewDidAppear
Abdul Waheed

penso che questa sia effettivamente la risposta corretta. il navigationController.view.backgroundColor = .whitenon funziona più su iOS 11.
AnBisw

1
@Annjawn, navigationController.view.backgroundColor = .whitefunziona su iOS 12. La rimozione del traslucido dalla barra di navigazione non può essere utilizzata nelle situazioni in cui è necessario, ma l'ombra nera no.
Alex Motor

38

la risposta di nonamelive è perfetta. Per ottenere lo stesso risultato in Interface Builder E MANTENERE ANCORA LA TRASLUCENZA , selezionare il controller di navigazione e impostare un attributo di runtime definito dall'utente view.backgroundColorcome mostrato nello screenshot (nell'Identity Inspector). Ripeti per tutti i controller di navigazione che mostrano questo problema.

Sembra che l'intero problema si verifichi perché il colore nero (o in realtà, nessun colore) di UINavigationController sta trapelando nel momento in cui CoreGraphics lo snapshot all'inizio dell'animazione. Quindi, impostarlo su bianco lo impedirà.

Identity Inspector -> Attributi di runtime definiti dall'utente


1
Preferisco questo approccio, lascia che l'interfaccia utente di Interface Builder sia il più possibile.
DazChong

iOS 8.4 non ha aiutato
Maksim Kniazev

3
Funziona perfettamente con Xcode 8.3.3. Solo per enfatizzare nuovamente, deve essere impostato su UINavigationController, non sul viewController.
jungledev

Avevo un navcon in un tabcon e ho visto le ombre su entrambe le barre (in alto e in basso) quando utilizzavo "Nasconde la barra in basso al momento di premere" su uno dei VC del navcon. L'impostazione dello sfondo bianco sul navcon ha corretto entrambe le ombre. Grazie!
nh32rg

6

Questo sembra essere un bug introdotto in iOS 7.1. Nel mio caso è causato da una UIToolbar posizionata direttamente sotto la barra di navigazione. L'ombra scura appare anche nella barra delle schede traslucida.

L'ombra sembra essere causata dalla visualizzazione in background della barra degli strumenti UIT. Ora utilizzo questa soluzione alternativa nel controller della vista con la barra degli strumenti che nasconde la visualizzazione in background della barra degli strumenti durante la transizione:

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

    UIView *toolbarBackgroundView = [self.toolbar findViewRecursively:^BOOL(UIView *subview, BOOL *stop) {
        BOOL isToolbarBackgroundView = ([subview isKindOfClass:[UIImageView class]]
                                        && [NSStringFromClass(subview.class) isEqualToString:@"_UIToolbarBackground"]);
        if (isToolbarBackgroundView) {
            *stop = YES;
        }
        return (! isToolbarBackgroundView);
    }];
    if (toolbarBackgroundView) {
        // fade toolbar background view back in
        [UIView animateWithDuration:0.1f animations:^{
            toolbarBackgroundView.alpha = 1.0f;
        }];
    }
}

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

    UIView *toolbarBackgroundView = [self.toolbar findViewRecursively:^BOOL(UIView *subview, BOOL *stop) {
        BOOL isToolbarBackgroundView = ([subview isKindOfClass:[UIImageView class]]
                                        && [NSStringFromClass(subview.class) isEqualToString:@"_UIToolbarBackground"]);
        if (isToolbarBackgroundView) {
            *stop = YES;
        }
        return (! isToolbarBackgroundView);
    }];
    if (toolbarBackgroundView) {
        // hide toolbar background view
        toolbarBackgroundView.alpha = 0.0f;
    }
}

Questo è il codice per [UIView findViewRecursively:]

@interface UIView (FindSubview)

- (UIView*)findViewRecursively:(BOOL(^)(UIView* subview, BOOL* stop))recurse;

@end

@implementation UIView (FindSubview)

- (UIView*)findViewRecursively:(BOOL(^)(UIView* subview, BOOL* stop))recurse {
    for (UIView* subview in self.subviews) {
        BOOL stop = NO;
        if (recurse(subview, &stop)) {
            UIView* view = [subview findViewRecursively:recurse];
            if (view) return view;
        } else if (stop) {
            return subview;
        }
    }
    return nil;
}

@end

Ho archiviato questo Radar: http://openradar.appspot.com/16418845


2
La tua soluzione va bene se non vuoi una barra di navigazione traslucida.
tom

C'è un modo più semplice per ottenere il file backgroundView. [self.toolbar valueForKey:@"_backgroundView"]. Tieni presente che questa è un'API privata, ma penso che non sarai catturato da Apple perché _backgroundViewè solo un nome generico.
armonico

Questa risposta mi ha fatto capire cosa dovevo fare. Nel mio caso è stato semplice come deselezionare l'opzione translucent sulla UIToolbar nel generatore di interfacce.
Greg W

4

Sembra che accada con qualsiasi barra (TabBar o ToolBar) traslucida.
Quindi un modo per risolverlo è impostare _tabBar.translucent = NO;(nel mio caso). Ciò impedisce l'ombra indesiderata sotto la barra di navigazione in alto lasciando la barra di navigazione traslucida. Purtroppo la barra inferiore non è più traslucida.

Può essere impostato di nuovo su traslucido ma tutto ciò deve accadere dopo che l'intera animazione di spinta è terminata, quindi cambiare questa proprietà è ben evidente.

Nel caso, tuttavia, anche la barra inferiore deve essere traslucida e non voglio che l'utente veda la modifica l'ho risolta con quanto segue:

/*  create a simple quick animation of the bottom bar
    just before pushing the new controller */
[UIView animateWithDuration:0.1
                 animations:^{
                     _tabBar.barTintColor = [UIColor colorWithWhite:0.97254901960784 alpha:1.0]; // this is the closest color for my case
                     _tabBar.translucent = NO;
                 } completion:^(BOOL finished) {
                     /* now when the animation that makes the bar not translucent
                        is finished we can push the new controller
                        the controller is instantiated before the animation code */
                     [self.navigationController pushViewController:controller animated:YES];
                 }];

Quindi in viewDidAppear:I lo ripristina semplicemente:

[UIView animateWithDuration:0.1
             animations:^{
                     _tabBar.barTintColor = nil;
                     _tabBar.translucent = YES;
                 }];

C'è solo un piccolo cambiamento nell'aspetto soprattutto, ma è appena percettibile ed è molto meglio che avere l'ombra sotto la barra di navigazione.

Spero che aiuti gli altri a mantenere le barre traslucide fino a quando Apple non risolverà questo comportamento poiché le barre SONO pensate per essere nascoste in alcuni casi a differenza di quanto è stato suggerito in altri post specialmente per il UITabBar


Sono stato in grado di risolvere questo problema adottando la soluzione di @manmal: definire l'attributo di runtime view.backgroundColorper il tuo UITabBarController nello storyboard e impostarlo su un colore bianco.
jamesk

4

Questo funziona per me in Swift

In AppDelegatesul didFinishLaunchingWithOptionsmetodo, ho impostato in questo modo:

UIApplication.shared.windows.first?.backgroundColor = .white

4

Questo funziona per me su iOS 13 con temi chiari e scuri e anche su versioni iOS precedenti.

Aggiungere il codice seguente ad AppDelegate al application(didFinishLaunchingWithOptions)metodo:

if #available(iOS 13.0, *) {
    window?.backgroundColor = UIColor.systemBackground
} else {
    window?.backgroundColor = UIColor.white
}

Anch'io ho provato questo metodo, ma devo affrontare un problema quando si presenta un controller di visualizzazione in modalità predefinita. Quindi vedrai lo sfondo bianco della finestra invece di quello nero. Sembra strano. potete suggerirmi qualche idea per superare questa situazione
varun v nair

3

Ecco la mia variazione ... richiede molto meno codice della risposta di Tom ed è più efficiente. Questo è SE vuoi una barra di navigazione traslucida e vuoi anche risolvere il problema dell'ombra.

Nel ViewController di origine (che è incorporato nel controller di navigazione) ...

- (void)viewDidAppear:(BOOL)animated
{
     self.navigationController.navigationBar.translucent = YES;
}

e

 - (void)viewWillDisappear:(BOOL)animated
 {
     self.navigationController.navigationBar.translucent = NO;
 }

Il risultato è lo stesso di quello che fa Tom (visivamente, per l'utente finale) ed è più facile da implementare. Spero che questo ti aiuti...


3
self.navigationController!.navigationBar.translucent = false;

Questo funziona per me, posizionalo all'interno della funzione in cui sposti il ​​nuovo ViewController


Pazzesco, ma tra tutte le risposte, l'idea di metterlo nella funzione che spinge al prossimo VC era quella!
Coltuxumab

3

Anche quanto segue funziona e lascia trasparente la barra di navigazione:

[UIApplication sharedApplication].keyWindow.backgroundColor = [UIColor whiteColor];


1

Sebbene non sia la stessa dell'implementazione iOS di serie, questo è un bel modo per risolvere il problema:

- (void)viewWillAppear:(BOOL)animated {
    [UIView animateWithDuration:0.35f animations:^{
        self.tabBarController.tabBar.alpha = 1.0f;
    }];
}

- (void)viewWillDisappear:(BOOL)animated {
    [UIView animateWithDuration:0.35f animations:^{
        self.tabBarController.tabBar.alpha = 0.0f;
    }];
}

Otterrai una bella animazione fade-in / fade-out della barra delle schede. Aggiungi il codice nella radice UIViewController.


-1

Oppure, se stai utilizzando il generatore di interfacce, puoi semplicemente selezionare la barra di navigazione dal tuo controller di navigazione e deselezionare la casella di controllo Traslucido tra Stile e Tinta barra nell'ispettore degli attributi per sbarazzarti di quello strano effetto -

Ispettore

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.