iOS之導(dǎo)航欄詳解

導(dǎo)航欄作為iOS開發(fā)的一大空控件來說,是非常的重要,可以實現(xiàn)各種效果,隱藏,透明,簡書的導(dǎo)航欄動畫等等,這次就寫一點自己的經(jīng)驗和總結(jié).

1.導(dǎo)航欄的基本屬性設(shè)置

導(dǎo)航欄的主要的子控件如下,其中都包含了所有的屬性和方法:

2.透明導(dǎo)航欄

1.思路是遍歷NavigationBar的子視圖,找到bar的背景圖片,控制它的hidden
附上代碼:

- (void)viewWillDisappear:(BOOL)animated
{
    [self NavigationBarClear:self.navigationController.navigationBar hidden:NO];
    self.navigationController.navigationBar.backgroundColor = [UIColor whiteColor];
}

- (void)viewWillAppear:(BOOL)animated
{
    [self NavigationBarClear:self.navigationController.navigationBar hidden:YES];
    self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
}

#pragma mark ----
#pragma mark privateMethods
-(void)NavigationBarClear:(UINavigationBar *)navigationBar hidden:(BOOL) hidden
{
    if ([navigationBar respondsToSelector:@selector( setBackgroundImage:forBarMetrics:)]){
        NSArray *list = navigationBar.subviews;
        for (id obj in list) {
            if ([obj isKindOfClass:[UIImageView class]]) {
                UIImageView *imageView = (UIImageView *)obj;
                imageView.hidden = hidden;
            }
        }
    }  
}
2.1.gif

2.是更換背景圖片

- (void)viewWillDisappear:(BOOL)animated
{
    [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
    [self.navigationController.navigationBar setShadowImage:nil];
}

- (void)viewWillAppear:(BOOL)animated
{
    [self.navigationController.navigationBar setBackgroundImage:[self imageWithBgColor:[UIColor colorWithRed:1 green:1 blue:1 alpha:0]] forBarMetrics:UIBarMetricsDefault];
    [self.navigationController.navigationBar setShadowImage:[self imageWithBgColor:[UIColor colorWithRed:1 green:1 blue:1 alpha:0]]];
}

#pragma mark ----
#pragma mark privateMethods
-(UIImage *)imageWithBgColor:(UIColor *)color {
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}
2.2.gif

3.導(dǎo)航欄根據(jù)滾動是否透明

1.基于2.1的基礎(chǔ)上實現(xiàn),主要是根據(jù)tableView的偏移量來對navTgationBar的背景色進(jìn)行設(shè)置,其中改了nav的frame,有一點小問題

#pragma mark ----
#pragma mark scrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    UIColor *color=[UIColor redColor];
    CGFloat offset=scrollView.contentOffset.y;
    self.navigationController.navigationBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 64);
    if (offset< 0) {
        self.navigationController.navigationBar.backgroundColor = [color colorWithAlphaComponent:1];
    }else{
        CGFloat alpha = offset / 200;
        if (alpha < 0.5) {
            self.navigationController.navigationBar.backgroundColor = [color colorWithAlphaComponent:0];
        }
    }
}
3.1.gif

2.是基于2.2的基礎(chǔ)上實現(xiàn)的,根據(jù)tableView的偏移量,去更改nav的背景圖片

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    [self.navigationController.navigationBar setBackgroundImage:[self imageWithBgColor:[UIColor colorWithRed:1 green:0 blue:0 alpha:self.tableView.contentOffset.y / 100]] forBarMetrics:UIBarMetricsDefault];
}
3.2.gif

  • 根據(jù)2.1,2.2 的比對,還是改變圖片實現(xiàn)比較合理一點,如果控制圖片的是否隱藏,會改變navBar的frame,然后對整體有一個向下20的偏移.

4.導(dǎo)航欄隱藏問題

進(jìn)入新的界面時隱藏狀態(tài)欄,view頂頭,在退出VC時記得把隱藏狀態(tài)改成NO

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:NO];
    self.navigationController.navigationBarHidden = YES;
}
4.1.gif

5.類似簡書的效果

根據(jù)scrollView的滾動方向在設(shè)置nav是否hidden,適當(dāng)做一個動畫可以讓體驗更好一些.

#pragma mark ----
#pragma mark scrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    
    if (willEndContentOffsetX > startContentOffsetX) {
        [UIView animateWithDuration:0.5 animations:^{
            //這里可以有一些其他的操作
        } completion:^(BOOL finished) {
            self.navigationController.navigationBarHidden = YES;
        }];
        
    }else{
        [UIView animateWithDuration:0.5 animations:^{
            //這里可以有一些其他的操作
        } completion:^(BOOL finished) {
            self.navigationController.navigationBarHidden = NO;
        }];
    }
    
}
#pragma mark scrollViewDelegate

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{    //拖動前的起始坐標(biāo)
    startContentOffsetX = scrollView.contentOffset.y;
}

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{    //將要停止前的坐標(biāo)
    willEndContentOffsetX = scrollView.contentOffset.y;
}
5.gif

有些人可能會遇到導(dǎo)航欄下面有一條黑線的問題

// 添加上這一句,可以去掉導(dǎo)航條下邊的shadowImage,就可以正常顯示了  
 self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];  
 self.navigationController.navigationBar.translucent = NO; 

問題類似


github鏈接

附加一個博客:
iOS 7 改變 app 的外觀(NavigationBar,TabBar,StatusBar)

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

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,374評論 4 61
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,062評論 25 709
  • 我這人外冷內(nèi)熱,相知的朋友不多,小學(xué)幾個,初中沒有,高中3個,大學(xué)最多,大學(xué)室友7個,班上1個,全是女生,從小到大...
    燊兒閱讀 251評論 0 0
  • 同學(xué)聚會越來被少數(shù)人的交既想做標(biāo)子走想立牌坊。當(dāng)真十分難辦。
    aweness閱讀 136評論 0 0
  • 誰用美麗的謊言騙一輩子 新生的嬰兒也在死亡 多少流浪、多少逃亡 一輩子人都沒有方向 把愛攪進(jìn)病榻 多少光在滴滴熄滅...
    H3190閱讀 164評論 0 1

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