標籤:
iOS開發UINavigation系列二——UINavigationItem 一、引言
UINavigationItem是導覽列上用於管理導航項的類,在上一篇部落格中,我們知道導覽列是通過push與pop的堆棧操作來對item進行管理的,同樣,每一個Item自身也有許多屬性可供我們進行自定製。這篇部落格,主要討論UINavigationItem的使用方法。
UINavigationBar:http://my.oschina.net/u/2340880/blog/527706。
二、來說說UINavigationItem
Item,從英文上來理解,它可以解釋為一個項目,因此,item不是一個簡單的label標題,也不是一個簡單的button按鈕,它是導覽列中管理的一個項目的抽象。說起來有些難於理解,通過代碼,我們就能很好的理解Item的意義。
首先,我們建立一個item,用UINavigationBar導覽列push出來:
UINavigationItem * item = [[UINavigationItem alloc]initWithTitle:@"title"]; UINavigationBar * bar = [[UINavigationBar alloc]initWithFrame:CGRectMake(0, 0, 320, 64)]; [bar pushNavigationItem:item animated:YES];
我們可以看到,在導覽列上的中間,有title這樣一個item:
除了建立一個標題item,我們也可以建立一個View類型的item:
UIView * view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 30, 30)]; view.backgroundColor = [UIColor brownColor]; item.titleView = view;
效果如下:
通過下面的屬性,可以給這個Item添加一個解說文字,這段文字會顯示在item的上方:
item.prompt= @"我是navigationItem的解說文字";
上面我們看到的這些,實際上只是一個item的一部分,item還有許多其他的附件,如果我們使導覽列再push出一個item,這時導覽列的左邊會出現一個返回按鈕,這個返回按鈕實際上是資料第一個item的,我們做如下的設定:
UINavigationItem * item = [[UINavigationItem alloc]initWithTitle:@"title"]; UINavigationItem * item2 = [[UINavigationItem alloc]initWithTitle:@"title2"]; item.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"title1" style:nil target:nil action:nil]; [bar pushNavigationItem:item animated:YES]; [bar pushNavigationItem:item2 animated:YES];
可以看出,雖然當前push出來的item是item2,但是左邊的返回按鈕是屬於item的。這裡有一點需要注意,雖然backBarButtonItem的標題我們可以自訂,但是方法和其他屬性我們都不能定製,是系統實現好的。
當然,我們也可以設定在push出來新的item的時候,隱藏前面的返回按鈕,使用如下屬性:
@property(nonatomic,assign) BOOL hidesBackButton;- (void)setHidesBackButton:(BOOL)hidesBackButton animated:(BOOL)animated;
預設為NO,設定為YES將會隱藏返回按鈕。
三、關於UIBarButtonItem
一個UINavigationItem中,還可以包含許多BarButtonItem,BarButtonItem是一系列的按鈕,會出現在導覽列的左側或者右側。例如:
UIBarButtonItem * button = [[UIBarButtonItem alloc]initWithTitle:@"按鈕" style:UIBarButtonItemStyleDone target:self action:@selector(click)]; item.leftBarButtonItem = button;
這個barButtonItem是一個按鈕,可以觸發一個方法,這有時候對我們來說十分有用。但是有一個你一定發現了,如果繼續push出來Item,原來的返回按鈕不見了,是否隱藏返回按鈕,由下面這個屬性控制:
item.leftItemsSupplementBackButton=YES;
我們也可以通過下面的方法設定右邊的按鈕,或者直接設定一組按鈕:
@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;@property(nullable,nonatomic,copy) NSArray<UIBarButtonItem *> *leftBarButtonItems;@property(nullable,nonatomic,copy) NSArray<UIBarButtonItem *> *rightBarButtonItems;- (void)setLeftBarButtonItems:(nullable NSArray<UIBarButtonItem *> *)items animated:(BOOL)animated;- (void)setRightBarButtonItems:(nullable NSArray<UIBarButtonItem *> *)items animated:(BOOL)animated;
四、再看UIBarButtonItem
上面我們瞭解到了,一個NavigationItem基本上是有三大部分組成的,當前顯示的部分,返回按鈕部分,和ButtonItem部分,同樣對於建立和設定UIBarButoonItem,也有很多方法供我們使用。
首先是建立與初始化的方法:
- (instancetype)initWithTitle:(nullable NSString *)title style:(UIBarButtonItemStyle)style target:(nullable id)target action:(nullable SEL)action;
這個方法通過一個標題建立ButtonItem,其中style參數可以設定一個風格,枚舉如下:
typedef NS_ENUM(NSInteger, UIBarButtonItemStyle) { UIBarButtonItemStylePlain, UIBarButtonItemStyleDone,};
這兩種風格差別並不大,如下是效果,Done風格的字型加粗一些:
我們因為可以通過一個圖片來建立BarButtonItem:
- (instancetype)initWithImage:(nullable UIImage *)image style:(UIBarButtonItemStyle)style target:(nullable id)target action:(nullable SEL)action;- (instancetype)initWithImage:(nullable UIImage *)image landscapeImagePhone:(nullable UIImage *)landscapeImagePhone style:(UIBarButtonItemStyle)style target:(nullable id)target action:(nullable SEL)action;
上面這兩個方法中,第一個方法與使用文字建立的方法類似,第二個方法多了一個landscapeImagePhone的參數,這個參數可以設定裝置橫屏時的圖片。
我們也可以使用自訂的View來建立BarButtonItem:
- (instancetype)initWithCustomView:(UIView *)customView;
除了上面一些自訂的建立方法外,對於BarButtonItem這個對象,系統也封裝好了許多原生的可以供我們使用,建立的時候使用如下方法:
UIBarButtonItem * button = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:nil];
上面的SystemItem是系統為我們做好的許多buttonItem的類型,枚舉如下:
typedef NS_ENUM(NSInteger, UIBarButtonSystemItem) { UIBarButtonSystemItemDone,//顯示完成 UIBarButtonSystemItemCancel,//顯示取消 UIBarButtonSystemItemEdit, //顯示編輯 UIBarButtonSystemItemSave, //顯示儲存 UIBarButtonSystemItemAdd,//顯示加號 UIBarButtonSystemItemFlexibleSpace,//什麼都不顯示,佔位一個空間位置 UIBarButtonSystemItemFixedSpace,//和上一個類似 UIBarButtonSystemItemCompose,//顯示寫入按鈕 UIBarButtonSystemItemReply,//顯示迴圈按鈕 UIBarButtonSystemItemAction,//顯示活動按鈕 UIBarButtonSystemItemOrganize,//顯示組合按鈕 UIBarButtonSystemItemBookmarks,//顯示圖書按鈕 UIBarButtonSystemItemSearch,//顯示尋找按鈕 UIBarButtonSystemItemRefresh,//顯示重新整理按鈕 UIBarButtonSystemItemStop,//顯示停止按鈕 UIBarButtonSystemItemCamera,//顯示相機按鈕 UIBarButtonSystemItemTrash,//顯示移除按鈕 UIBarButtonSystemItemPlay,//顯示播放按鈕 UIBarButtonSystemItemPause,//顯示暫停按鈕 UIBarButtonSystemItemRewind,//顯示退後按鈕 UIBarButtonSystemItemFastForward,//顯示前進按鈕 UIBarButtonSystemItemUndo,//顯示消除按鈕 UIBarButtonSystemItemRedo ,//顯示重做按鈕 UIBarButtonSystemItemPageCurl ,//在tool上有效};
iOS開發UINavigation系列二——UINavigationItem