ModernPromptView 是啥在哪?
我们都知道在导航栏里都有个title的标题,这个标题是通过导航栏里的当前的ViewController的实例来设置的。
self.title = "标题"
这样是没有用滴: navigationController?.navigationItem.title = "标题"
那么是否注意过,有的app在title的上面偶尔也会出现一串小的字符提示呢?
确实有唉!这样的设计还有些小清新呢,但是这个事个什么鬼东西呢?沃日··· 不会是整个导航栏都是完全自定义的吧!就为了个提示语?
当然不了,这就是传说中的ModernPromptView是NavigationBar自带的,全名是UINavigationBarModernPromptView。(中文名咋叫呢,打开谷歌翻译 → 摩登提示视图 沃日···🙃 这么难叫又不朗朗上口,叫出来会被笑话的吧 )
这鸡儿多高呢,Reveal展示 在 iOS 9 上为30, iOS 11 上为34,
ModernPromptView上面有个Label,来展示内容的。如果你不赋值的话,那么这个view是不会显示的,也不会让NavigationBar变高。
赋值:
navigationItem.prompt = "完毕"
这个label的字体和颜色是可以修改的(如果你不嫌麻烦的去像下面这样的取)但字体大小会被 摩登提示视图🤣 的高度限制,对了不特殊设置的话,字体颜色为黑色。很丑
let barsubViews = navigationController?.navigationBar.subviews;
for subView in barsubViews! {
let Anyclass = object_getClass(subView)
let classStr = String(describing: Anyclass!)
if classStr == "_UINavigationBarModernPromptView"
{
let promptLabel = subView.subviews[0] as! UILabel
promptLabel.textColor = UIColor.white
promptLabel.font = UIFont.systemFont(ofSize: 16)
}
}
我在本示例中 将它用于网络加载的提示,通过控制计时器的不断赋值,来实现Load· 、Load·· 、 Load···。但是实际效果并不好看。
多说一句 Reveal都打开了当然顺便贴一下NavigationBar视图的内部视图了
很明显NavigationBar的一级子视图有三个(这里没有设置iOS11才有的largeTitle)
UIBarBackGround frame:(0, -20, ScreenWidth, 98) 98就是 20 + 34(在iOS 9 中是30)+ 44 整个导航栏和状态栏的高度。
UINavigationBarContentView frame:(0, 34, ScreenWidth, 44) 此视图内部很复杂,本文不做展开讨论了。
UINavigationBarModernPromptView frame(0, 0, ScreenWidth, 34) 摩登提示视图🤣 内部很简单只有一个Label来展示文字