UINavigationController

  • UINavigationController的子控制器
//UINavigationController以棧的形式保存子控制器
@property(nonatomic,copy) NSArray *viewControllers;
@property(nonatomic,readonly) NSArray *childViewControllers;

//使用push方法能將某個(gè)控制器壓入棧
- (void)pushViewController:(UIViewController *)viewController 
                  animated:(BOOL)animated;

//使用pop方法可以移除控制器
//將棧頂?shù)目刂破饕瞥?- (UIViewController *)popViewControllerAnimated:(BOOL)animated;
//回到指定的子控制器
- (NSArray *)popToViewController:(UIViewController *)viewController
                        animated:(BOOL)animated;
//回到根控制器(棧底控制器)
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;
  • 如何修改導(dǎo)航欄的內(nèi)容
//導(dǎo)航欄的內(nèi)容由棧頂控制器的navigationItem屬性決定

//UINavigationItem有以下屬性影響著導(dǎo)航欄的內(nèi)容
//左上角的返回按鈕
@property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;
//中間的標(biāo)題視圖
@property(nonatomic,retain) UIView          *titleView;
//中間的標(biāo)題文字
@property(nonatomic,copy)   NSString        *title;
//左上角的視圖
@property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem; 
//右上角的視圖
@property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;

導(dǎo)航欄的注意點(diǎn)

  • 在iOS7之后默認(rèn)會(huì)把導(dǎo)航條上面的按鈕渲染成藍(lán)色 在加載圖片的時(shí)候聲明不要渲染
UIImage *image = [UIImage imageNamed:@"imageName"];
// 通過代碼不要渲染圖片
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

  • 導(dǎo)航條上面的內(nèi)容位置不能由開發(fā)者決定,開發(fā)者只能控制尺寸 示例:
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setImage:[UIImage imageNamed:@"imageName"] forState:UIControlStateNormal];
[btn setImage:[UIImage imageNamed:@"imageName"] forState:UIControlStateHighlighted];
//btn.frame = CGRectMake(2000, 2000, 30, 30);  位置無效 尺寸有效
// 控件的尺寸由圖片決定 僅僅是設(shè)置尺寸
[btn sizeToFit];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btn];

導(dǎo)航欄的常見問題

  • 導(dǎo)航欄在push和pop時(shí)候顏色混亂的問題

  • navigationBar的默認(rèn)顏色是淺白色 并且有透明效果 所以如果view的顏色是其他顏色的話 navigationBar就會(huì)在push、pop的時(shí)候產(chǎn)生一些暗灰色的效果 如果設(shè)置的是圖片就沒有這樣的效果

  • 覆蓋導(dǎo)航欄的返回按鈕側(cè)滑返回功能失效的問題

  • navBar的左邊的按鈕如果被覆蓋掉,那么它的的pop手勢就沒有了 這個(gè)時(shí)候我們需要自己設(shè)置就有效。在只有一個(gè)子控制器的時(shí)候禁止手勢 否則手勢在發(fā)生的時(shí)候就會(huì)有bug

    self.interactivePopGestureRecognizer.delegate = self;
    
    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
        // 手勢何時(shí)有效 : 當(dāng)導(dǎo)航控制器的子控制器個(gè)數(shù) > 1就有效
        return self.childViewControllers.count > 1;
    }
    
  • 有時(shí)候需要自定義左邊返回按鈕距離屏幕邊緣的距離問題

  • 讓內(nèi)容的內(nèi)邊距向左偏移 這個(gè)時(shí)候button的內(nèi)容就會(huì)偏出button的frame 但是由于navBar的左邊返回的觸發(fā)范圍是比較大的 所以不必?fù)?dān)心 點(diǎn)擊了超出部分button不響應(yīng)的問題

backButton.contentEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容