事情3如何着色他们的状态栏文本

时间:2017-05-29 23:32:33

标签: ios swift

Things 3 Screenshot

Things 3中,iOS应用中的状态栏文字(无线信号,时间,电池等)为中灰色。通常情况下,状态栏中只能包含黑色或白色文本。

他们是如何做到的?

我的第一个猜测是他们有一个半透明的白色UIView覆盖状态栏,但我不确定他们是如何取消它的。我很想知道如何在Swift中做到这一点。

2 个答案:

答案 0 :(得分:4)

以下是Swift中的一些示例代码,它们似乎非常接近地模仿了Things 3状态栏的效果。实质上,您正在创建另一个窗口,将其直接放置在状态栏上,这将略微淡化颜色。

此示例中需要注意的重要事项:

  • 我们将新的UIWindow分配给一个属性,否则它将在我们离开范围后立即释放。
  • 我们将windowLevel设置为UIWindowLevelStatusBar
  • 我们将isHidden设置为false而不是调用makeKeyAndVisible,因为我们仍希望普通窗口成为关键窗口

AppDelegate.swift

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var overlayWindow = UIWindow()

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        overlayWindow.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 20)
        overlayWindow.windowLevel = UIWindowLevelStatusBar
        overlayWindow.backgroundColor = UIColor(white: 1, alpha: 0.4)
        overlayWindow.rootViewController = UIViewController()
        overlayWindow.isHidden = false

        return true
    }
}

答案 1 :(得分:1)

我希望他们就像你说的那样在状态栏上添加UIWindow。以下是执行此操作的示例代码(在Objective-C中。)

http://www.b2cloud.com.au/tutorial/multiple-uiwindows/

UIWindow* topWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
[topWindow setWindowLevel:UIWindowLevelAlert];

CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;

UIViewController* viewController = [[ViewController alloc] init];
UIView* overlay = [[UIView alloc] initWithFrame:CGRectMake(0, -statusBarHeight, viewController.view.frame.size.width, statusBarHeight - 1)];
[overlay setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
[overlay setBackgroundColor:[UIColor colorWithRed:1 green:0 blue:0 alpha:0.5]];
[viewController.view addSubview:overlay];
[topWindow setRootViewController:viewController];

[topWindow setHidden:NO];
[topWindow setUserInteractionEnabled:NO];

[viewController release];
viewController = nil;

[overlay release];
overlay = nil;