Android_花式组件,自定义组件

NavigationBar里的ModernPromptView

2018-07-24  本文已影响191人  像个被吓坏的孩子

ModernPromptView 是啥在哪?

我们都知道在导航栏里都有个title的标题,这个标题是通过导航栏里的当前的ViewController的实例来设置的。
self.title = "标题"

这样是没有用滴: navigationController?.navigationItem.title = "标题"

那么是否注意过,有的app在title的上面偶尔也会出现一串小的字符提示呢?


IMG_1884.jpg
屏幕快照 2018-07-14 11.35.05.png

确实有唉!这样的设计还有些小清新呢,但是这个事个什么鬼东西呢?沃日··· 不会是整个导航栏都是完全自定义的吧!就为了个提示语?

当然不了,这就是传说中的ModernPromptView是NavigationBar自带的,全名是UINavigationBarModernPromptView。(中文名咋叫呢,打开谷歌翻译 → 摩登提示视图 沃日···🙃 这么难叫又不朗朗上口,叫出来会被笑话的吧 )


xChange.jpg 屏幕快照_2018-07-14_11_35_05.png

这鸡儿多高呢,Reveal展示 在 iOS 9 上为30, iOS 11 上为34,


屏幕快照 2018-07-14 14.50.38.png

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视图的内部视图了

屏幕快照 2018-07-14 15.29.57.png

很明显NavigationBar的一级子视图有三个(这里没有设置iOS11才有的largeTitle)

  1. UIBarBackGround frame:(0, -20, ScreenWidth, 98) 98就是 20 + 34(在iOS 9 中是30)+ 44 整个导航栏和状态栏的高度。


    屏幕快照 2018-07-14 15.35.04.png
  1. UINavigationBarContentView frame:(0, 34, ScreenWidth, 44) 此视图内部很复杂,本文不做展开讨论了。


    屏幕快照 2018-07-14 15.43.48.png
  1. UINavigationBarModernPromptView frame(0, 0, ScreenWidth, 34) 摩登提示视图🤣 内部很简单只有一个Label来展示文字


    屏幕快照 2018-07-14 15.45.55.png
上一篇下一篇

猜你喜欢

热点阅读