ModernPromptView 是啥在哪?
我們都知道在導(dǎo)航欄里都有個title的標(biāo)題,這個標(biāo)題是通過導(dǎo)航欄里的當(dāng)前的ViewController的實例來設(shè)置的。
self.title = "標(biāo)題"
這樣是沒有用滴: navigationController?.navigationItem.title = "標(biāo)題"
那么是否注意過,有的app在title的上面偶爾也會出現(xiàn)一串小的字符提示呢?


確實有唉!這樣的設(shè)計還有些小清新呢,但是這個事個什么鬼東西呢?沃日··· 不會是整個導(dǎo)航欄都是完全自定義的吧!就為了個提示語?
當(dāng)然不了,這就是傳說中的ModernPromptView是NavigationBar自帶的,全名是UINavigationBarModernPromptView。(中文名咋叫呢,打開谷歌翻譯 → 摩登提示視圖 沃日···?? 這么難叫又不朗朗上口,叫出來會被笑話的吧 )


這雞兒多高呢,Reveal展示 在 iOS 9 上為30, iOS 11 上為34,

ModernPromptView上面有個Label,來展示內(nèi)容的。如果你不賦值的話,那么這個view是不會顯示的,也不會讓NavigationBar變高。
賦值:
navigationItem.prompt = "完畢"
這個label的字體和顏色是可以修改的(如果你不嫌麻煩的去像下面這樣的?。┑煮w大小會被 摩登提示視圖?? 的高度限制,對了不特殊設(shè)置的話,字體顏色為黑色。很丑
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)
}
}
我在本示例中 將它用于網(wǎng)絡(luò)加載的提示,通過控制計時器的不斷賦值,來實現(xiàn)Load· 、Load·· 、 Load···。但是實際效果并不好看。
多說一句 Reveal都打開了當(dāng)然順便貼一下NavigationBar視圖的內(nèi)部視圖了

很明顯NavigationBar的一級子視圖有三個(這里沒有設(shè)置iOS11才有的largeTitle)
UIBarBackGround frame:(0, -20, ScreenWidth, 98) 98就是 20 + 34(在iOS 9 中是30)+ 44 整個導(dǎo)航欄和狀態(tài)欄的高度。
屏幕快照 2018-07-14 15.35.04.png
UINavigationBarContentView frame:(0, 34, ScreenWidth, 44) 此視圖內(nèi)部很復(fù)雜,本文不做展開討論了。
屏幕快照 2018-07-14 15.43.48.png
UINavigationBarModernPromptView frame(0, 0, ScreenWidth, 34) 摩登提示視圖?? 內(nèi)部很簡單只有一個Label來展示文字
屏幕快照 2018-07-14 15.45.55.png


