iOS之導航欄的漸變隱藏及顯示

在項目中往往有的時候需要導航欄的狀態是變化的,有的時候需要隱藏,為的是顯示更多的頁面,有的時候需要顯示出來,給用戶以提示,所以就需要隱藏和顯示導航欄。正如下面的示意圖所示:


示意圖

分析

本個項目中,展示的是一個導航控制器,其中導航控制器中有個UIViewController或者是UITableviewController為根控制器的這么一個結構。

實現

因此在storyboard中我們將之前控制器刪除,然后拖一個導航控制器出來,然后試著先綁定一個UITableviewController為根控制器。

導航欄的設置

為了讓我們的header view所展示的位置是在左上角的圓點位置,我們需要把自動偏移設置關掉。

    self.automaticallyAdjustsScrollViewInsets = NO;

下面就需要隱藏導航欄操作了,我們都知道導航欄有一個隱藏的屬性,下面試試

    self.navigationController.navigationBar.hidden = YES;

這種方法雖然能夠讓導航欄消失隱藏掉,但是如果我們要進行滾動tableview的時候,就不能讓導航欄漸變的顯示出來,所以這種方法不能滿足要求。
這種方法行不通那么用透明度的方案來試試:

    self.navigationController.navigationBar.alpha = 0;

截圖如下:


導航欄沒有消失掉

因此上面的方案不能實現功能。
可以使用設置導航欄背景圖片進行設置,這樣就可以設置導航欄的背景有個透明度的變化。

    [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];

當傳入的圖片為nil的時候,會自動的創建一個半透明的圖片作為導航欄的背景。所以這種方案是可行的,但是導航欄下面的那一根線我們是希望不顯示的:

    [self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]];

這樣一來,導航欄的那根線就取消掉了。
以上導航欄的基本實現方案已經確定了,但是下面的列表的顯示還有些疑問,到底是用的tableview顯示,利用tableview的headerView;還是用UIViewController進行展示頭部的控件,下面的部分就用tableview進行展示。

UITableviewController 方案

我們先試著作出示意圖的效果,一個tableview上放置一個headerView。

    UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 200)];
    header.backgroundColor = [UIColor redColor];
    self.tableView.tableHeaderView = header;

運行下,看效果:

tableview header方案

看示意圖,我們可以看到整個tableview都在移動,而不是我們效果圖那種的樣式,在往下滾動的時候,頭部的控件是不會網下移動的,但是利用tableview的headerView進行布局的方案是不成功的。

UIViewController 方案

我們首先在view上放置一個tableview和UIView(放置頭部的那些圖片)。

頁面的層級

以上都是在storyboard中操作的。


UIViewController方案添加header

以上的效果圖中可以看到頭部的headerView沒有類似于tableview的headerView那種滾動的時候出現下移的情況。所以這種方式是可行的。
但是我們還需要設置tableview的偏移量,因為圖片的顯示,遮擋住了我們的列表,所以需要設置一個偏移量:

    self.tableView.contentInset = UIEdgeInsetsMake(244, 0, 0, 0);

導航欄的一些細節處理

導航欄的文字,在剛開始出現的時候是需要隱藏掉的,

    //設置標題
    UILabel *title = [[UILabel alloc] init];
    title.text = @"個人主頁";
    [title sizeToFit];
    // 開始的時候看不見,所以alpha值為0
    title.textColor = [UIColor colorWithWhite:0 alpha:0];
    self.navigationItem.titleView = title;

雖然我們已經把文字隱藏掉了,但是已進入到控制器,我們還是能看到導航欄,所以我們需要在進入到控制器的時候隱藏掉,就在storyboard中進行設置就可以了,選中控制器:


隱藏導航欄

把top Bar的設置改為None就可以了。

實現滾動隱藏或顯示導航欄

我們知道tableview是繼承自scrollView的,所以有個-scrollViewDidScroll:方法中可以拿到tableview的滾動。而且當調用contentInset會自動調用-scrollViewDidScroll:
我們可以這個方法中監聽到scrollView的偏移量:

#pragma mark - scrollview
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    NSLog(@"%f", scrollView.contentOffset.y); //  原始偏移的位置是-244
}

所以導航欄的一些控制操作就在這個方法中進行實現。
我們需要注意到的是,當整個頁面上移到一定的位置的時候,就不在上移了,因為需要留夠64的位置給導航欄進行顯示。也就是說這個顯示圖片這部分上移到一定的位置就不在移動了。
我們需要改變這個控件的高度,那么就需要修改這個控件高度的約束,所以就需要拖個約束到控制器中。

// 頭部展示高度約束
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *imageHeight;

計算頭部的高度:

    CGFloat offset = scrollView.contentOffset.y - oriOfftY;
    CGFloat imgH = oriHeight - offset;
    if (imgH < 64) {
        // 當上移到距離頂部小于64的時候,就不在移動了。
        imgH = 64;
    }
    self.imageHeight.constant = imgH;
上移、下移
到此我們就需要處理透明度漸變的問題了。

由效果圖可以知道,整個頁面上移到一定的距離,就會完全顯示出導航欄,下移一定的距離,導航欄就會消失掉。

    //透明度
    //找最大值/
    CGFloat alpha = offset * 1 / 136.0;   // (200 - 64) / 136.0f
    if (alpha >= 1) {
        // 透明度最大值
        alpha = 0.99;
    }

設置文字:

    //拿到標題 標題文字的隨著移動高度的變化而變化
    UILabel *titleL = (UILabel *)self.navigationItem.titleView;
    titleL.textColor = [UIColor colorWithWhite:0 alpha:alpha];

最后一步就是修改導航欄的背景的漸變效果:

    //把顏色生成圖片
    UIColor *alphaColor = [UIColor colorWithWhite:1 alpha:alpha];
    //把顏色生成圖片
    UIImage *alphaImage = [UIImage imageWithColor:alphaColor];
    //修改導航條背景圖片
    [self.navigationController.navigationBar setBackgroundImage:alphaImage forBarMetrics:UIBarMetricsDefault];

-imageWithColor :這個方法是UIImage的一個分類中的方法,專門就是把顏色轉換成圖片的方法:

// 顏色轉為圖片
+ (UIImage *)imageWithColor:(UIColor *)color {
    CGRect rect = CGRectMake(0, 0, 1.0f, 1.0f);
    // 開啟位圖上下文
    UIGraphicsBeginImageContext(rect.size);
    // 開啟上下文
    CGContextRef ref = UIGraphicsGetCurrentContext();
    // 使用color演示填充上下文
    CGContextSetFillColorWithColor(ref, color.CGColor);
    // 渲染上下文
    CGContextFillRect(ref, rect);
    // 從上下文中獲取圖片
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    // 結束上下文
    UIGraphicsEndImageContext();
    return image;
}

以上基本完成了想要的效果圖的功能了。
代碼傳送門,如果有幫助你的話,GitHub上給個贊唄!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,153評論 4 61
  • 大家好,我今天想說說a的故事。 希望能對一些人能有一些小小的幫助。 a并不是什么大人物,只是一個普通得不能再普通的...
    imBarbara閱讀 152評論 0 0
  • 馬背上的民族, 弓箭,牧羊,滾打,食肉 草原上的群狼, 忍耐,智慧,協作,奔放 狼守護著草原, 控制黃羊的數量,避...
    月亭閱讀 527評論 12 8