今天再來給大家帶來一個開發中常用到的視圖控制器,在很多應用中,可能都會遇到這樣的一個需求:表視圖控制器最上方有一個頭圖控件,當表格視圖滑動在頂部時,導航欄透明,當表格視圖逐漸向下滑動時,導航欄漸漸出現,并且在滑動期間,頭圖會展示相關的漸變動畫效果。以前經常會遇到這樣的需求,但從沒有整理與封裝完善,這次将其封裝成完整的控件,無論有無導航,都可以很好的支援,友善以後使用也提供給需要的朋友。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SY0U2MwADNlNWN0kzYlhTOyMmN0MzY4EGZ5QzN5ETZ58CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
在設計控件之前,我們應該先編寫控件的頭檔案,頭檔案中将控件需要的屬性和方法列舉,之後再按定義好的接口一步步的來實作控件的編寫設計,這樣可以結構清晰,并且不會顯得無從下手,控件的頭檔案設計如下:
//
// 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出來,我在這個控件的實作時做了相容,實際上無論有無導航,控件内部都沒有使用系統的導航欄,而是模拟實作了一個自定義的導航欄來與系統的導航無縫銜接。