Próbowałem na wiele sposobów ustawić styl paska stanu (domyślny lub lekki), ale nie mogę go uruchomić na podstawie kontrolera widoku. Mogę ustawić styl paska stanu tylko dla całej aplikacji.
Czy ktoś ma podpowiedź?
próbowałem UIViewControllerBasedStatusBarAppearance
i
-(UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
ale te metody nie działają.
ios
cocoa-touch
Van Du Tran
źródło
źródło
Odpowiedzi:
Czy próbowałeś tego?
Ustaw opcję „Wyświetl wygląd paska stanu opartego na kontrolerze” (
UIViewControllerBasedStatusBarAppearance
)YES
w Info.plist. (YES
jest wartością domyślną, więc możesz też po prostu pozostawić tę wartość poza swoją plistą).W metodzie viewDidLoad wywołaj
[self setNeedsStatusBarAppearanceUpdate]
.Zaimplementuj
preferredStatusBarStyle
, zwracając styl paska stanu, który chcesz dla tego kontrolera widoku.- (UIStatusBarStyle) preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
źródło
Jest tu pewien haczyk, jeśli kontroler widoku znajduje się w autonomicznym UINavigationController i nie jest częścią UINavigationController opartego na Storyboard, to przede wszystkim zawodzą metody. Natknąłem się na tę sytuację, a następnie, aby ustawić pasek stanu na styl światła, użyłem następującego
[self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];
To zadziałało idealnie dla mnie.
źródło
UINavigationBar.barStyle
zastępujepreferredStatusBarStyle
. Bez względu na to, jak ustawiszpreferredStatusBarStyle
, jeden cholerny `UINavigationBar.setBarStyle 'przejmuje wszystko.EDYTUJ: To rozwiązanie jest przestarzałe w systemie iOS 9. Wybierz jedną z pozostałych odpowiedzi.
Po
UIViewControllerBasedStatusBarAppearance
ustawieniu na NIE mogłem ustawić styl na biały tekst za pomocą:[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackTranslucent;
Dzieje się tak, ponieważ kolor tekstu w tym stylu był biały na iOS 6 i starszych.
AKTUALIZACJA: Według @jowie możesz to wypróbować na iOS8:
[UIApplication sharedApplication].statusBarStyle = UIBarStyleBlack;
źródło
UIBarStyleBlack
.W Swift mogłem to zrobić pisząc:
let tbc : UITabBarController = self.window?.rootViewController as UITabBarController var moreViewController : UINavigationController = tbc.moreNavigationController moreViewController.navigationBar.barStyle = UIBarStyle.Black
Zasadniczo interesuje Cię ostatnia linia.
Spowodowało to zmianę paska zakładek na biały:
Zauważ, że nic nie zmieniłem
Info.plist
, aby osiągnąć ten wynik.Aby uzyskać więcej informacji dotyczących zmian
Navigation Status Bar
, sprawdź ten link: http://www.appcoda.com/customize-navigation-status-bar-ios-7/źródło
W metodzie viewDidLoad umieść to:
Cel C
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; [self setNeedsStatusBarAppearanceUpdate];
Szybki
UIApplication.shared.statusBarStyle = .lightContent self.setNeedsStatusBarAppearanceUpdate()
źródło
AppDelegate
) lub dla każdego kontrolera widoku.Założę się, że kontroler widoku jest wbudowany w kontroler nawigacji. Aby uniknąć ustawiania stylu paska nawigacji do
.Black
używania tej podklasy:class YourNavigationController: UINavigationController { override func childViewControllerForStatusBarStyle() -> UIViewController? { return topViewController } }
źródło
Szybki:
let tbc : UITabBarController = self.window?.rootViewController as UITabBarController var moreViewController : UINavigationController = tbc.moreNavigationController moreViewController.navigationBar.barStyle = UIBarStyle.Black
Cel C:
dołącz to do
controller.m
metody viewDidLoad pliku:[self setNeedsStatusBarAppearanceUpdate].
następnie zaimplementuj tę metodę w tym samym
controller.m
pliku:- (UIStatusBarStyle) preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
Oficjalne dokumenty:
https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/Bars.html
Artykuł, który napisałem na swoim blogu:
http://www.ryadel.com/2015/03/04/xcode-set-status-bar-style-and-color-in-objective-c/
źródło
W kontrolerze ViewController, w którym chcesz zmienić kolor paska stanu
- (void) viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; } - (void) viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; }
źródło
Szybkie rozszerzenie, ponieważ zawsze zapominam, jak to działa
extension UIViewController { // utility to set the status bar appearance // Note: Make sure "View controller-based status bar appearance" is set to NO in your target settings or this won't work func setStatusBarForDarkBackground(dark: Bool) { UIApplication.sharedApplication().statusBarStyle = dark ? .LightContent : .Default setNeedsStatusBarAppearanceUpdate() } }
źródło
Xcode 10.3,
W symulatorze iPhone'a 8 12.4 jest OK.
W symulatorze iPhone X 12.4 próbowałem wszystkiego powyżej, nie OK.
Następnie dodaję ręcznie, pasek stanu składa się z czasu, baterii, komórki.
StatusBarView
class StatusBottomView: UIView { private var batteryView:BatteryView! private var timeLabel:UILabel! private var timer:Timer? override init(frame: CGRect) { super.init(frame: frame) addSubviews() } private func addSubviews() { batteryView = BatteryView() batteryView.tintColor = UIColor.blue addSubview(batteryView) timeLabel = UILabel() timeLabel.textAlignment = .center timeLabel.font = UIFont.systemFont(ofSize: 12) timeLabel.textColor = UIColor.blue addSubview(timeLabel) didChangeTime() addTimer() } override func layoutSubviews() { super.layoutSubviews() let h = frame.size.height let x: CGFloat = 80 batteryView.frame.origin = CGPoint(x: ScreenHeight - x - DZMBatterySize.width, y: (h - DZMBatterySize.height) / 2) timeLabel.frame = CGRect(x: x, y: 0, width: 50, height: h) } // MARK: -- Timer func addTimer() { if timer == nil { timer = Timer.scheduledTimer(timeInterval: 15, target: self, selector: #selector(didChangeTime), userInfo: nil, repeats: true) RunLoop.current.add(timer!, forMode: .common) } } func removeTimer() { if timer != nil { timer!.invalidate() timer = nil } } @objc func didChangeTime() { timeLabel.text = TimerString("HH:mm") batteryView.batteryLevel = UIDevice.current.batteryLevel } }
BatteryLevelView
class BatteryView: UIImageView { override var tintColor: UIColor! { didSet{ batteryLevelView.backgroundColor = tintColor } } /// BatteryLevel var batteryLevel:Float = 0 { didSet{ setNeedsLayout() } } /// BatteryLevelView private var batteryLevelView:UIView! convenience init() { self.init(frame: CGRect(x: 0, y: 0, width: DZMBatterySize.width, height: DZMBatterySize.height)) } override init(frame: CGRect) { super.init(frame: CGRect(x: 0, y: 0, width: DZMBatterySize.width, height: DZMBatterySize.height)) addSubviews() } func addSubviews() { batteryLevelView = UIView() batteryLevelView.layer.masksToBounds = true addSubview(batteryLevelView) image = UIImage(named: "battery_black")?.withRenderingMode(.alwaysTemplate) tintColor = UIColor.white } override func layoutSubviews() { super.layoutSubviews() let spaceW:CGFloat = 1 * (frame.width / DZMBatterySize.width) * HJBatteryLevelViewScale let spaceH:CGFloat = 1 * (frame.height / DZMBatterySize.height) * HJBatteryLevelViewScale let batteryLevelViewY:CGFloat = 2.1*spaceH let batteryLevelViewX:CGFloat = 1.4*spaceW let batteryLevelViewH:CGFloat = frame.height - 3.4*spaceH let batteryLevelViewW:CGFloat = frame.width * HJBatteryLevelViewScale let batteryLevelViewWScale:CGFloat = batteryLevelViewW / 100 var tempBatteryLevel = batteryLevel if batteryLevel < 0 { tempBatteryLevel = 0 }else if batteryLevel > 1 { tempBatteryLevel = 1 } batteryLevelView.frame = CGRect(x: batteryLevelViewX , y: batteryLevelViewY, width: CGFloat(tempBatteryLevel * 100) * batteryLevelViewWScale, height: batteryLevelViewH) batteryLevelView.layer.cornerRadius = batteryLevelViewH * 0.125 } }
źródło