天天看點

iOS頭部漸變的表格視圖設計(一)

       今天再來給大家帶來一個開發中常用到的視圖控制器,在很多應用中,可能都會遇到這樣的一個需求:表視圖控制器最上方有一個頭圖控件,當表格視圖滑動在頂部時,導航欄透明,當表格視圖逐漸向下滑動時,導航欄漸漸出現,并且在滑動期間,頭圖會展示相關的漸變動畫效果。以前經常會遇到這樣的需求,但從沒有整理與封裝完善,這次将其封裝成完整的控件,無論有無導航,都可以很好的支援,友善以後使用也提供給需要的朋友。

iOS頭部漸變的表格視圖設計(一)
iOS頭部漸變的表格視圖設計(一)

       在設計控件之前,我們應該先編寫控件的頭檔案,頭檔案中将控件需要的屬性和方法列舉,之後再按定義好的接口一步步的來實作控件的編寫設計,這樣可以結構清晰,并且不會顯得無從下手,控件的頭檔案設計如下:

//

//  YHBaseHeaderAnimatedViewController.h

//  YHBaseFoundationTest

//  Created by vip on 16/4/26.

//  Copyright © 2016年 jaki.zhang. All rights reserved.

/*

*  這個視圖控制器建立出帶縮放頭圖效果的視圖控制器

*  tip:

*      1.這個視圖控制器如果是被導航push出來的 則内部會使用假導航進行漸隐模拟

*      2.這個視圖控制器如果是被present出來的 則不會出現假導航欄

*      3.這個視圖控制器中自帶一個TableView 設定TableView的頭圖不會影響原動畫效果

*

*/

#import <UIKit/UIKit.h>

/**

*  這個枚舉設定頭圖動畫滑動的速度等級

typedef enum {

   YHBaseHeaderAnimatedLevelSlow,

   YHBaseHeaderAnimatedLevelNormal,

   YHBaseHeaderAnimatedLevelFast

}YHBaseHeaderAnimatedLevel;

@interface YHBaseHeaderAnimatedViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>

@property(nonatomic,strong,readonly)UITableView * tableView;

*  設定動畫頭圖圖檔

@property(nonatomic,strong)UIView * animatedHeaderView;

*  設定TableView的頭視圖

*  注意:設定tableView的頭視圖不能夠在使用tableHeatherView方法 要使用這個屬性設定

@property(nonatomic,strong)UIView * tableHeaderView;

*  設定動畫頭圖高度

*  這個屬性如果不設定或者設定為0 則預設會使用設定的image圖檔比例

@property(nonatomic,assign)CGFloat headerHeight;

*  設定動畫滑動速率

@property(nonatomic,assign)YHBaseHeaderAnimatedLevel animatedlevel;

*  設定頭圖可方法的最大scrollView偏移量 預設為40

@property(nonatomic,assign)CGFloat maxScrollOffset;

*  設定是否帶漸隐效果

@property(nonatomic,assign)BOOL alphaAnimated;

*  設定最小漸變到的alpha漸隐值 <0 >1之間 預設為0.5

@property(nonatomic,assign)CGFloat minAlpha;

*  是否顯示毛玻璃模糊效果

@property(nonatomic,assign)BOOL bluerAnimated;

*  設定最大小模糊度 預設為1

@property(nonatomic,assign)CGFloat maxBluer;

*  設定導航欄顔色 預設白色

@property(nonatomic,strong)UIColor * naviColor;

*  設定導航左側按鈕數組 如果不設定 會自動帶一個傳回按鈕

@property(nonatomic,strong)NSArray * leftBarButtons;

@property(nonatomic,strong)NSArray * rightBarButtons;

*  這個方法在修改了頭圖相關屬性後 需要調用重新整理

*  注意:如果重新設定了TableView的tableheaderView屬性 也需要調用這個方法重新整理

-(void)reloadAnimatedView;

@end

     在設計這個控件時,我主要考慮兩個需要優化的地方,第一是這個控制器在不同的場景下可能會有不同的結構,例如在導航結構中被push出來或者通過模态跳轉被present出來,我在這個控件的實作時做了相容,實際上無論有無導航,控件内部都沒有使用系統的導航欄,而是模拟實作了一個自定義的導航欄來與系統的導航無縫銜接。

繼續閱讀