Comments (5)
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
在有 navigationbar 时颜色不发生变化,原因是:
These methods control the attributes of the status bar when this view controller is shown. They can be overridden in view controller subclasses to return the desired status bar attributes.
大意是说当 view controller 显示的时候,这个方法可以用来控制状态栏的属性。你可以在 UIViewController 的子类中重载该方法返回你期望的状态栏属性。
那为什么我现在重载该方法却不起作用呢?事实上preferredStatusBarStyle()根本未被调用。原因能是 UINavigationController 作为一个容器“承包”了这些事情。我们所添加的 view controller 都在它的导航栈中,可以说这些控制器都是导航栏控制器的child view controller。此时导航栏控制器才是真正能操作状态栏的 Boss。
所以要在 UINavigationController 设置
from ios-swift-learning-notes.
在导航栈中的第一个 view controller 里的状态栏为白色,第二个 view controller 里的状态栏为黑色。上面这种在导航栏控制器中控制状态栏属性的一刀切的粗暴做法显然不符合我们的要求,那么这里有另外一个方法 :
// Override to return a child view controller or nil. If non-nil, that view controller's status bar appearance attributes will be used. If nil, self is used. Whenever the return values from these methods change, -setNeedsUpdatedStatusBarAttributes should be called.
@available(iOS 7.0, *)
public func childViewControllerForStatusBarStyle() -> UIViewController?
大意是,如果这个方法返回值为 non-nil,则将更改状态栏属性的控制权移交给你返回的那个控制器。如果返回值为 nil 或者不重载该方法,那么由自己负责控制状态栏的属性。当状态栏的样式被更改之前,该控制器的-setNeedsUpdatedStatusBarAttributes方法应该被调用。
如果在该 UIViewController 已经在显示在当前,你可能还要在当前页面不时的更改状态栏的 style,那么你需要先调用-setNeedsStatusBarAppearanceUpdate方法(它通知系统去调用当前UIViewController 的-preferredStatusBarStyle方法)。
要实现我们的需求,就只能在NavigationController中重载-childViewControllerForStatusBarStyle方法,既然它返回一个视图控制器的实例,那么我们只要将导航栈中的topViewController作为返回值(该方法会被调用多次,且每次~~设置状态栏 style ~~push/pop view controller 该方法都会被调用),然后在需要设置状态栏 style 的 view controller 中像最开始一样重载-preferredStatusBarStyle方法即可。
override func childViewControllerForStatusBarStyle() -> UIViewController? {
return self.topViewController
}
from ios-swift-learning-notes.
class ViewController: UIViewController {
var isHidden:Bool = false
@IBAction func clicked(sender: AnyObject) {
isHidden = !isHidden
UIView.animate(withDuration: 0.5) { () -> Void in
self.setNeedsStatusBarAppearanceUpdate()
}
}
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return UIStatusBarAnimation.slide
}
override var prefersStatusBarHidden: Bool {
return isHidden
}
}
from ios-swift-learning-notes.
extension UINavigationController {
func preferredStatusBarStyle() -> UIStatusBarStyle {
if self.presentingViewController != nil {
// NavigationController的presentingViewController不会为nil时,通常意味着Modal
return self.presentingViewController!.preferredStatusBarStyle()
}
else {
guard self.topViewController != nil else { return .Default }
return (self.topViewController!.preferredStatusBarStyle());
}
}
}
from ios-swift-learning-notes.
注意:我们通常使用的viewController都是嵌套在UINavigationController中使用的,此时在viewController中使用
- (UIStatusBarStyle)preferredStatusBarStyle;函数会发现设置并没有生效。
背景色
另一种方法就是通过设置navigationBar的setBarTintColor颜色来改变状态栏颜色
childViewControllerForStatusBarStyle
这个函数的返回值默认返回nil,此时系统就会调用当前viewControllerA的preferredStatusBarStyle函数;如果返回值是另一个viewControllerB那么系统就会调用viewControllerB的preferredStatusBarStyle函数。
运用这个函数就可以解决嵌套UINavigationController设置样式无效的问题。
解释一下为什么嵌套UINavigationController的viewController的preferredStatusBarStyle函数设置无效:
在我们嵌套了UINavigationController的时候,我们的
AppDelegate.window.rootViewController
通常是我们创建的navigationController,这时首先会调用的是navigationController中的childViewControllerForStatusBarStyle函数,因为默认返回nil,那么接下来就会调用navigationController本身的preferredStatusBarStyle函数,所以我们在viewController中通过preferredStatusBarStyle函数设置的状态栏样式就不会被调用发现,所以也就无效了。
所以我们要自己创建一个继承于UINavigationcontroller的
NavigationController,在这个子类中重写
childViewControllerForStatusBarStyle函数
- (UIViewController *)childViewControllerForStatusBarStyle{
return self.topViewController;
}
这样navigationController中的childViewControllerForStatusBarStyle函数会返回navigationController中最上层的viewController,那么viewController中的preferredStatusBarStyle函数的设置就会被系统获知
preferredStatusBarUpdateAnimation
这个函数返回了动画效果。动画效果只有在prefersStatusBarHidden
函数返回值变化的时候才会展示,同时要通过调用
[self setNeedsStatusBarAppearanceUpdate]函数来重绘状态栏
自定义
我们可以通过隐藏系统状态栏,然后自定义UIWindow
通过设置setWindowLevel:UIWindowLevelStatusBar实现自定义状态栏。
from ios-swift-learning-notes.
Related Issues (20)
- scrollView add tableView 上下滑动混乱
- wkWebView save image crash
- textView textViewDidChange 不能随意赋值
- navigationItem.titleView 和 navigationController?.navigationItem.titleView
- iOS 11 navigationItem.titleView Width Not Set
- textField 的变化可以通过通知监听
- textField 有焦点 无弹键盘 HOT 1
- 阴影 shadow
- 正确设置 nib 中颜色
- IGListKit 待研究
- Error casting value of type 'UICollectionReusableView'
- AVAudioPlayer throws breakpoint in debug mode
- Button 长按 点击 gesture
- 约束不全 导致页面部分错乱
- cell 重用要重新初始化 所有有修改的成员变量 视图
- 发一次通知 接受到多次,循环引用造成 ctrl 不能销毁
- path 包含中文 转 url 无法使用
- 查看更新版本记录
- xcode 注释
- 一些容易导致错误的默认值 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from ios-swift-learning-notes.