やっと出来ました。

前回(【iOS】StatuBarをアニメーションで非表示にする | AdMax Tech Blog)の記事でやったStatusBarにアニメーション+テキスト表示ってやつですが、NavigationBarを表示させていても出来ましたので、それの共有です。

こんな感じになります。

Animation03

ということでソースコードを紹介します。

ソースコード

ViewController.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import UIKit
class ViewController: UIViewController {
var shouldBeHidingStatusBar: Bool = false
var statusBarTextLabel: UILabel?
var overlayWindow: UIWindow?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - IBAction
@IBAction func startStatusBarAnimation(sender: AnyObject) {
self.shouldBeHidingStatusBar = !self.shouldBeHidingStatusBar
if self.shouldBeHidingStatusBar {
self.statusBarHiddenAnimation()
} else {
self.statusBarShowAnimation()
}
}
// MARK:- Private
private func getStatusBarTextLabel() -> UILabel {
if let textLabel = self.statusBarTextLabel {
return textLabel
}
let statusBarRect = UIApplication.sharedApplication().statusBarFrame
let width = max(statusBarRect.size.width, statusBarRect.size.height)
let height = min(statusBarRect.size.width, statusBarRect.size.height)
self.statusBarTextLabel = UILabel(frame: CGRect(x: 0.0, y: -20.0, width: width, height: height))
self.statusBarTextLabel?.textAlignment = NSTextAlignment.Center
self.statusBarTextLabel?.font = UIFont.systemFontOfSize(13.0)
self.statusBarTextLabel?.alpha = 1.0
self.statusBarTextLabel?.text = "Hidden StatusBar"
self.statusBarTextLabel?.textColor = UIColor.whiteColor()
self.statusBarTextLabel?.backgroundColor = UIColor.blueColor()
return self.statusBarTextLabel!
}
private func getOverlayWindow() -> UIWindow {
if let o = self.overlayWindow {
return o
}
self.overlayWindow = UIWindow(frame: UIScreen.mainScreen().bounds)
self.overlayWindow?.autoresizingMask = (UIViewAutoresizing.FlexibleWidth|UIViewAutoresizing.FlexibleHeight)
self.overlayWindow?.backgroundColor = UIColor.clearColor()
self.overlayWindow?.userInteractionEnabled = false
self.overlayWindow?.windowLevel = UIWindowLevelStatusBar
self.overlayWindow?.rootViewController = StatusBarViewController()
self.overlayWindow?.rootViewController?.view.backgroundColor = UIColor.clearColor()
self.overlayWindow?.rootViewController?.view.addSubview(self.getStatusBarTextLabel())
return self.overlayWindow!
}
private func statusBarHiddenAnimation() {
self.getOverlayWindow().hidden = false
UIView.animateWithDuration(0.5, animations: { () -> Void in
self.getStatusBarTextLabel().frame.origin = CGPoint(x: 0.0, y: 0.0)
})
}
private func statusBarShowAnimation() {
UIView.animateWithDuration(0.5, animations: { () -> Void in
self.getStatusBarTextLabel().frame.origin = CGPoint(x: 0.0, y: -20.0)
}, completion: { (completion: Bool) -> Void in
self.getOverlayWindow().hidden = true
})
}
}
StatusBarViewController.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import UIKit
class StatusBarViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Private
private func rootViewControllerOfKeyWindow() -> UIViewController? {
let keyWindow: UIWindow? = UIApplication.sharedApplication().keyWindow
let ourWindow: UIWindow? = self.view.window
if keyWindow != ourWindow {
return keyWindow?.rootViewController
}
for window in UIApplication.sharedApplication().windows {
if let w = window as? UIWindow {
if w != ourWindow {
return w.rootViewController
}
}
}
return nil
}
// MARK: - Rotation
override func shouldAutorotate() -> Bool {
return self.rootViewControllerOfKeyWindow()!.shouldAutorotate()
}
override func supportedInterfaceOrientations() -> Int {
return self.rootViewControllerOfKeyWindow()!.supportedInterfaceOrientations()
}
override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
return self.rootViewControllerOfKeyWindow()!.preferredInterfaceOrientationForPresentation()
}
// MARK: - StatusBar
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return UIApplication.sharedApplication().statusBarStyle
}
override func prefersStatusBarHidden() -> Bool {
return false
}
}

解説

ざっくり言うと

  • UIWindowを作成して、現状のUIWindowの上に表示する

という感じです。

UINavigationBarStatusBarの上にUIViewを表示するとなるとこの方法になるらしいです。

どうやって実装するのかを知りたかったので、とっても手抜き間は否めません…。

ただ表示、非表示のやり方がわかったのでライブラリ化なども簡単にできると思います。

ちなみに…

僕がやりたかったことがライブラリでありました。

JDStatusBarNotification

ScreenShot91

CocoaPodsにも対応しているので、簡単に使う事が出来ます。

相当なことがない限り、このライブラリを使う事をおすすめします…。

最後に

とりあえず出来たのでよかったです。

サンプルも更新したので、よかったら確認してください。

NinjaAdMax / SampleStatusBarAnimation

以上になります。