Intenté muchas formas de configurar el estilo de la barra de estado (predeterminado o contenido ligero) pero no puedo hacer que funcione por controlador de vista. Puedo configurar el estilo de la barra de estado solo para toda la aplicación.
¿Alguien tiene una pista?
Lo intenté UIViewControllerBasedStatusBarAppearance
y
-(UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
pero estos métodos no funcionan.
ios
cocoa-touch
Van Du Tran
fuente
fuente
Respuestas:
¿Has probado esto?
Establezca "Ver apariencia de la barra de estado basada en el controlador" (
UIViewControllerBasedStatusBarAppearance
)YES
en su Info.plist. (YES
es el valor predeterminado, por lo que también puede dejar este valor fuera de su plist).En su método viewDidLoad, llame
[self setNeedsStatusBarAppearanceUpdate]
.Implementar
preferredStatusBarStyle
, devolviendo el estilo de barra de estado que desea para este controlador de vista.- (UIStatusBarStyle) preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
fuente
Hay un problema aquí si su controlador de vista está dentro de UINavigationController independiente y no es parte de UINavigationController basado en Storyboard, entonces todos los métodos fallan. Me encontré con esta situación y luego, para configurar la barra de estado en el estilo de luz, usé lo siguiente
[self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];
Esto funcionó perfectamente para mí.
fuente
UINavigationBar.barStyle
anulapreferredStatusBarStyle
. No importa cómo lo establezcapreferredStatusBarStyle
, un maldito 'UINavigationBar.setBarStyle' se hace cargo de todo.EDITAR: Esta solución está obsoleta en iOS 9. Elija una de las otras respuestas.
Con
UIViewControllerBasedStatusBarAppearance
establecido en NO, pude establecer el estilo en texto blanco usando:[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackTranslucent;
Esto se debe a que el color del texto de este estilo era blanco en iOS 6 y versiones anteriores.
ACTUALIZACIÓN: Según @jowie, puedes probar eso en iOS8:
[UIApplication sharedApplication].statusBarStyle = UIBarStyleBlack;
fuente
UIBarStyleBlack
.En Swift pude hacer esto escribiendo:
let tbc : UITabBarController = self.window?.rootViewController as UITabBarController var moreViewController : UINavigationController = tbc.moreNavigationController moreViewController.navigationBar.barStyle = UIBarStyle.Black
Básicamente estás interesado en la última línea.
Esto resultó en que la barra de pestañas cambiara a blanco:
Tenga en cuenta que no cambié nada
Info.plist
para lograr este resultado.Para obtener más información sobre el cambio
Navigation Status Bar
, consulte este enlace: http://www.appcoda.com/customize-navigation-status-bar-ios-7/fuente
En el método viewDidLoad, ponga esto:
C objetivo
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; [self setNeedsStatusBarAppearanceUpdate];
Rápido
UIApplication.shared.statusBarStyle = .lightContent self.setNeedsStatusBarAppearanceUpdate()
fuente
AppDelegate
) o por controlador de vista.Apuesto a que tiene su controlador de vista integrado en un controlador de navegación. Para evitar configurar el estilo de la barra de navegación para
.Black
usar esta subclase:class YourNavigationController: UINavigationController { override func childViewControllerForStatusBarStyle() -> UIViewController? { return topViewController } }
fuente
Rápido:
let tbc : UITabBarController = self.window?.rootViewController as UITabBarController var moreViewController : UINavigationController = tbc.moreNavigationController moreViewController.navigationBar.barStyle = UIBarStyle.Black
C objetivo:
agregue esto al
controller.m
método de archivo viewDidLoad:[self setNeedsStatusBarAppearanceUpdate].
luego implemente este método en ese mismo
controller.m
archivo:- (UIStatusBarStyle) preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
Documentos oficiales:
https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/Bars.html
Artículo que escribí en mi blog:
http://www.ryadel.com/2015/03/04/xcode-set-status-bar-style-and-color-in-objective-c/
fuente
En el ViewController que desea cambiar el color de la barra de estado
- (void) viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; } - (void) viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; }
fuente
Extensión rápida para esto porque siempre olvido cómo funciona esto
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() } }
fuente
Xcode 10.3,
En iPhone 8 12.4 Simulator, está bien.
En iPhone X 12.4 Simulator, probé todo lo anterior, no está bien.
Luego lo agrego a mano, la barra de estado consta de tiempo, batería, celular.
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 } }
fuente