Chcę, aby pasek UINavigationBar w mojej aplikacji był całkowicie przezroczysty i znajdował się na równi z kontrolerem widoku bezpośrednio pod nim. Jednak jedyny kod, jaki udało mi się znaleźć, jest półprzezroczysty, ale nieprzejrzysty. Wiem, że można to zrobić w iOS 7, ponieważ jest używany w aplikacji do notatek. Moje pytanie brzmi: jaki jest kod, którego użyli do tego?
cocoa-touch
uinavigationbar
transparency
translucency
cory ginsberg
źródło
źródło
self.edgesForExtendedLayout = UIRectEdgeNone;
Dla Swift3 i Swift4
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.isTranslucent = true
Dla Swift2.2
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true
W przypadku Objective-C
[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = [UIImage new]; self.navigationController.navigationBar.translucent = YES;
źródło
Samodzielne rozwiązanie jako kategoria celu-C:
UINavigationController + TransparentNavigationController.h
@interface UINavigationController (TransparentNavigationController) - (void)presentTransparentNavigationBar; - (void)hideTransparentNavigationBar; @end
UINavigationController + TransparentNavigationController.m
#import "UINavigationController+TransparentNavigationController.h" @implementation UINavigationController (TransparentNavigationController) - (void)presentTransparentNavigationBar { [self.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault]; [self.navigationBar setTranslucent:YES]; [self.navigationBar setShadowImage:[UIImage new]]; [self setNavigationBarHidden:NO animated:YES]; } - (void)hideTransparentNavigationBar { [self setNavigationBarHidden:YES animated:NO]; [self.navigationBar setBackgroundImage:[[UINavigationBar appearance] backgroundImageForBarMetrics:UIBarMetricsDefault] forBarMetrics:UIBarMetricsDefault]; [self.navigationBar setTranslucent:[[UINavigationBar appearance] isTranslucent]]; [self.navigationBar setShadowImage:[[UINavigationBar appearance] shadowImage]]; } @end
Teraz możesz zaimportować kategorię do swojego
UIViewController
i wywołać metody w kontrolerze nawigacji - na przykład:#import "UINavigationController+TransparentNavigationController.h" - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController presentTransparentNavigationBar]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.navigationController hideTransparentNavigationBar]; }
I podobne rozwiązanie w Swift :
import Foundation import UIKit extension UINavigationController { public func presentTransparentNavigationBar() { navigationBar.setBackgroundImage(UIImage(), forBarMetrics:UIBarMetrics.Default) navigationBar.translucent = true navigationBar.shadowImage = UIImage() setNavigationBarHidden(false, animated:true) } public func hideTransparentNavigationBar() { setNavigationBarHidden(true, animated:false) navigationBar.setBackgroundImage(UINavigationBar.appearance().backgroundImageForBarMetrics(UIBarMetrics.Default), forBarMetrics:UIBarMetrics.Default) navigationBar.translucent = UINavigationBar.appearance().translucent navigationBar.shadowImage = UINavigationBar.appearance().shadowImage } }
źródło
hideTransparentNavigationBar()
powinien zresetować go z powrotem.viewDidHide
nadrzędnym kontrolerze widoku.Alan zapomniał o jednej linijce
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
Więc mam:
[self.navigationController.navigationBar setTranslucent:YES]; self.navigationController.view.backgroundColor = [UIColor clearColor]; [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init]; self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
źródło
Świetna odpowiedź @ Zorayra poprawiona do Swift 3:
import Foundation import UIKit extension UINavigationController { public func presentTransparentNavigationBar() { navigationBar.setBackgroundImage(UIImage(), for:.default) navigationBar.isTranslucent = true navigationBar.shadowImage = UIImage() setNavigationBarHidden(false, animated:true) } public func hideTransparentNavigationBar() { setNavigationBarHidden(true, animated:false) navigationBar.setBackgroundImage(UINavigationBar.appearance().backgroundImage(for: UIBarMetrics.default), for:.default) navigationBar.isTranslucent = UINavigationBar.appearance().isTranslucent navigationBar.shadowImage = UINavigationBar.appearance().shadowImage } }
źródło
Swift 4.2 oraz iOS 12
Okazuje się, że wszystko, czego naprawdę potrzebujesz, to poniższy kod. Działa idealnie po włożeniu
viewDidLoad()
.// removes line at bottom of navigation bar navigationController?.navigationBar.shadowImage = UIImage() // makes navigation bar completely transparent navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) navigationController?.navigationBar.isTranslucent = true
źródło
Użyj poda UINavigationBar + Addition , a następnie po prostu zadzwoń:
UINavigationBar *navigationBar = self.navigationController.navigationBar; [navigationBar makeTransparent];
źródło
[(UIView *) [self.navigationController.navigationBar.subviews objectAtIndex: 0] setAlpha: 0.0f];
Ta jedna linijka wydawała mi się działać idealnie dla mnie
źródło