在Things 3中,iOS应用中的状态栏文字(无线信号,时间,电池等)为中灰色。通常情况下,状态栏中只能包含黑色或白色文本。
他们是如何做到的?
我的第一个猜测是他们有一个半透明的白色UIView
覆盖状态栏,但我不确定他们是如何取消它的。我很想知道如何在Swift中做到这一点。
答案 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;