在XCode 8.2 / Swift 3.0中更改状态栏样式(否"查看基于控制器的状态栏外观")

时间:2017-01-24 09:14:58

标签: ios swift statusbar

我正在尝试修改状态栏的外观(将文字设为白色/将样式设置为"灯光")。我设法通过将其添加到我的AppDelegate.swift文件来设置背景颜色:

let statWindow = UIApplication.shared.value(forKey:"statusBarWindow") as! UIView
let statusBar = statWindow.subviews[0] as UIView
statusBar.backgroundColor = UIColor(red: 0/255.0, green: 0/255.0, blue: 0/255.0, alpha: 1.0)

但是,当我去改变状态栏文本的样式时,甚至在General>下更改它。部署信息>状态栏样式(将其更改为" Light")不起作用。

我还尝试通过Info.plist修改状态栏,但是没有字段用于"查看基于控制器的状态栏外观" (见第二张图)。此外,没有选择"灯"状态栏样式选项下的样式(见下图):

状态栏样式选项: ScreenShot

没有视图控制器状态栏字段: ScreenShot

4 个答案:

答案 0 :(得分:10)

您错过的步骤是Info.plist。

打开应用的info.plist文件,将 UIViewControllerBasedStatusBarAppearance 设置为(如下所示)。

Screenshot

注意:如果以下情况不存在,则可以添加此密钥:

1)将鼠标悬停在现有条目上以显示添加/删除图标:

enter image description here

2)单击加号图标以添加新的键/值对:

enter image description here

3)将UIViewControllerBasedStatusBarAppearance粘贴到关键字段中,并将其值设置为NO。请注意,取消选中时,密钥将更改为View controller-based status...,但它是相同的:

enter image description here enter image description here

答案 1 :(得分:7)

在应用程序的每个UIViewController中,您应该覆盖preferredStatusBarStyle属性:

override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }

并最终致电:

<your controller>.setNeedsStatusBarAppearanceUpdate()

如果这个statusBar样式贯穿你的所有应用程序,你应该创建一个实现它的BaseViewController类,并使你所有的视图控制器继承自BaseViewController。

答案 2 :(得分:7)

swift 3

如果在Info.plist中查看基于控制器的状态栏外观= YES

然后将此扩展名用于所有NavigationController

mWeekView.setEmptyViewClickListener(new
 WeekView.EmptyViewClickListener() {

     @Override
     public void onEmptyViewClicked(Calendar time) {

         String startTime = String.format("%02d:%02d",time.get(Calendar.HOUR_OF_DAY),time.get(Calendar.MINUTE));
         time.add(Calendar.MONTH, 1);
         String startdate = String.format("%d/%s/%s",time.get(Calendar.DAY_OF_MONTH),time.get(Calendar.MONTH)+1,time.get(Calendar.YEAR));
         time.add(Calendar.MONTH, -1);
         time.add(Calendar.MINUTE, 60);
         String endtime   = String.format("%02d:%02d",time.get(Calendar.HOUR_OF_DAY),time.get(Calendar.MINUTE));/*time.getTimeInMillis()+60*60*1000*/


         Intent intent = new Intent(getActivity(),AddAppointment.class);
         intent.putExtra("daystartdate", startdate);
         intent.putExtra("daystartTime",startTime);
         intent.putExtra("dayendtime",endtime);
         startActivity(intent);
     }
 });

如果没有UINavigationController且只有UIViewController,那么使用下面的代码:

    extension UINavigationController
    {
        override open var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
         }
     }

目标c

创建类别类

对于UIViewController

在UIViewController + StatusBarStyle.h

    extension UIViewController
    {
        override open var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
         }
     }

在UIViewController + StatusBarStyle.m

 @interface UIViewController (StatusBarStyle)
 @end

适用于UINavigationController

在UINavigationController + StatusBarStyle.h

 #import "UIViewController+StatusBarStyle.h"

 @implementation UIViewController (StatusBarStyle)

 -(UIStatusBarStyle)preferredStatusBarStyle {
  return UIStatusBarStyleLightContent;
 }

 @end 

在UINavigationController + StatusBarStyle.m

 @interface UINavigationController (StatusBarStyle)
 @end

答案 3 :(得分:0)

对于Xcode 10,您可以简单地为UIViewController或UITableViewController ecc创建一个类。并将其放在您的UIViewController类之前,您可以在所有视图控制器中都需要调用此类的内容状态栏很浅...

class UIViewControllerWithLightStatusBar: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return UIStatusBarStyle.lightContent
}
}

在AppDelegate中设置状态栏:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().isTranslucent = false
    UINavigationBar.appearance().clipsToBounds = false
    UINavigationBar.appearance().barStyle = .blackOpaque

    return true
}

现在您使用UIViewControllerWithLightStatusBar更改类UIViewController

class YourViewController: UIViewControllerWithLightStatusBar {
...
}

就是这样...