iOS_UI开发中容易被忽略的细节之--UINavigationItem.h

前言

这里有极其重要的一个细节,在当前控制器里打印:

// 它们是同一个 navigationItem !!! 即 navigationBar 的 items 中的第一个 navItem 是控制器的 navItem
    NSLog(@"%@", self.navigationController.navigationBar.items[0]);
    NSLog(@"%@", self.navigationItem);

通过上一节的 UINavigationBar 的学习,知道了 UINavigationItem 是可以在 navigationBar 上 push 和 pop 上操作的,之前对 UINavigationItem 的使用仅仅限于控制器的 navigationItem 属性。尴尬...(觉得应该把标题改成 “UI开发中容易被我忽略的细节之...”)

目录

    1. UINavigationItem 的属性和方法

一、UINavigationItem 的属性和方法:

首先 UINavigationItem 是继承自 NSObject的,在之前的印象中一致把它作为视图使用,以为至少也应该是继承自 UIView 的吧,之前的自以为完全错误!(UINavigationController 继承自 UIViewController,UINavigationBar 继承自 UIView)

NS_CLASS_AVAILABLE_IOS(2_0) @interface UINavigationItem : NSObject <NSCoding>
// iOS 11 后出现的,largeTitle 的显示 mode 枚举
typedef NS_ENUM(NSInteger, UINavigationItemLargeTitleDisplayMode) {
    /// Automatically use the large out-of-line title based on the state of the previous item in the navigation bar. An item with largeTitleDisplayMode=Automatic will show or hide the large title based on the request of the previous navigation item. If the first item pushed is set to Automatic, then it will show the large title if the navigation bar has prefersLargeTitles=YES.
    UINavigationItemLargeTitleDisplayModeAutomatic,
    /// Always use a larger title when this item is top most.
    UINavigationItemLargeTitleDisplayModeAlways,
    /// Never use a larger title when this item is top most.
    UINavigationItemLargeTitleDisplayModeNever,
} NS_SWIFT_NAME(UINavigationItem.LargeTitleDisplayMode);
// 指定初始化方法
- (instancetype)initWithTitle:(NSString *)title NS_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
// 在堆栈最顶部的标题,默认是 nil
@property(nullable, nonatomic,copy)   NSString        *title; 
// 用来代替上面 title 的自定义 View,水平大小,当 item 在堆栈顶的时候使用
// frame 默认居中
@property(nullable, nonatomic,strong) UIView          *titleView;
// 在  title 上方显示的文字,navigationBar 会变宽
@property(nullable,nonatomic,copy)   NSString *prompt __TVOS_PROHIBITED;

如果 topItem 设置了 prompt,而 backItem 没有设置 prompt,则点击 topItem 左侧的返回按钮不能 pop


prompt.gif
// 定义子 navigationItem 的左侧的返回按钮,即做 push 操作后,topItem 左边的返回按钮
@property(nullable,nonatomic,strong) UIBarButtonItem *backBarButtonItem __TVOS_PROHIBITED;
// navigationItem 隐藏自己左边的返回按钮
// 和 backBarButtonItem 不同,hidesBackButton 是对自己左边返回按钮起作用,而 backBarButtonItem 设置的是 push 出现的 navigationItem 左边的返回按钮
@property(nonatomic,assign) BOOL hidesBackButton __TVOS_PROHIBITED
// 动画隐藏
- (void)setHidesBackButton:(BOOL)hidesBackButton animated:(BOOL)animated __TVOS_PROHIBITED;
// iOS 5  之后出现的,设置左右两边的 Item 的组
// 这里有一个很有意思的点,如果把一个 BarButtonItem 放在数组里面设置为 leftBarButtonItems 或 rightBarButtonItems,这时候在把这个 BarButtonItem 设置为 leftBarButtonItem 或 rightBarButtonItem 是无效的
@property(nullable,nonatomic,copy) NSArray<UIBarButtonItem *> *leftBarButtonItems NS_AVAILABLE_IOS(5_0);
@property(nullable,nonatomic,copy) NSArray<UIBarButtonItem *> *rightBarButtonItems NS_AVAILABLE_IOS(5_0);
- (void)setLeftBarButtonItems:(nullable NSArray<UIBarButtonItem *> *)items animated:(BOOL)animated NS_AVAILABLE_IOS(5_0);
- (void)setRightBarButtonItems:(nullable NSArray<UIBarButtonItem *> *)items animated:(BOOL)animated NS_AVAILABLE_IOS(5_0);
// iOS 5 之后出现的,设置  topItem 的  leftBarButtonItems 或 leftBarButtonItem 时,backBarButtonItem 会自动隐藏 
// 设置该属性为 YES,则可以同时显示 backBarButtonItem 
@property(nonatomic) BOOL leftItemsSupplementBackButton NS_AVAILABLE_IOS(5_0) __TVOS_PROHIBITED;
// 给 navigationItem 添加左右按钮
// 设置 leftItemsSupplementBackButton 为 YES,才能使 leftBarButtonItem 和 backBarButtonItem 同时显示
@property(nullable, nonatomic,strong) UIBarButtonItem *leftBarButtonItem;
@property(nullable, nonatomic,strong) UIBarButtonItem *rightBarButtonItem;
- (void)setLeftBarButtonItem:(nullable UIBarButtonItem *)item animated:(BOOL)animated;
- (void)setRightBarButtonItem:(nullable UIBarButtonItem *)item animated:(BOOL)animated;
// iOS 11 后出现的,当 navigationBar 的 prefersLargeTitles 设置为 YES 时,即有 largeTitle 显示时,largeTitleDisplayMode 用来设置其显示样式
@property (nonatomic, readwrite, assign) UINavigationItemLargeTitleDisplayMode largeTitleDisplayMode API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos);
// iOS 11 后出现的,在导航条上添加搜索框,且导航条自动变宽
@property (nonatomic, retain, nullable) UISearchController *searchController API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos);
searchController.png
// iOS 11 后出现的,默认为 YES,topViewController 是 tableViewController 是,滚动 tableView 隐藏 searchBar 
@property (nonatomic) BOOL hidesSearchBarWhenScrolling API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos);
hidesSearchBarWhenScrolling.gif

至此 navigationItem.h 看完了,平时我们用的最多是 leftBarButtonItem、rightBarButtonItem 和 backBarButtonItem,大家都比较熟悉了,leftItemsSupplementBackButton 需要注意一下,设置为 YES ,保证 backBarButtonItem 正常显示。
另外是 iOS 11 后添加的几个属性,应该了解一下。
这里有很重要的一点,连着上一节的 navigationBar 的那部分思考一下,为什么 navigationBar 能 push 和 pop navigationItem 呢,且方式什么的和导航条 push 和 pop 子控制器一样。其实我们在导航堆栈里面的 push 和 pop 操作的时候,nvigationBar 的 nvaigationItem 堆栈里面也在跟着 push 和 pop,直白一点说,就是我们 push 到新控制器的时候,新控制器也会新建 navigationItem 并添加到 navigationBar 的 Items 里面去。

// 在当前控制打印下面两句,输出是一样的:
NSLog(@"%@", self.navigationController.navigationBar.topItem);
NSLog(@"%@", self.navigationItem);

end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容