在iOS6.0以後的版本中水果加入了UICollectionView控件,可是UICollection並不支持iOS6.0以前的版本。要實現UICollectionView能夠有許多方法:可使用UITableView,經過自定義UITableViewCell來實現相似UICollectionView的佈局樣式,也能夠經過徹底重寫UITableView來從新實現一遍(有點從新造輪子的嫌疑)。ide
這裏咱們選擇後面一種方法來實現,這樣能夠充分的理解UITableview的重用機制以及其具體實現方式。首先在編碼以前咱們應該清楚咱們須要什麼:一個Collection容器與用來展現內容的CollectionItem。這時最基本的,因爲在項目中須要用到上拉更多、下拉刷新以及headerView的功能因此還須要更多、刷新的View,在以後的計算過程當中也須要考慮到headerView。佈局
首先建立CollectionItem編碼
#import <UIKit/UIKit.h> #import <Foundation/Foundation.h> @interface iCollectionItem : UIView @property (strong,nonatomic) UIImageView *backgroundImage; @property (strong,nonatomic) NSString *reuseIdentifier; @property (assign,nonatomic) CGPoint point; @property (strong,nonatomic) NSString *itemIdentifier; -(id)initWithReuseIdentifier:(NSString *)identifier; -(void)itemTaped; -(void)reset; @end
在Item的頭文件中定義了背景ImageView、重用標誌、用來指示位置的point屬性,初始化事件、點擊事件、重置方法、兩個Item對比的方法。 在實現文件中首先引入須要的頭文件。atom
#import "iCollectionItem.h" #import "iCollectionView.h" @interface iCollectionItem() @property(strong,nonatomic) UITapGestureRecognizer *tapGR; @end
初始化方法中對item進行初始化code
-(id)initWithReuseIdentifier:(NSString *)identifier{ self=[super init]; if (self) { _reuseIdentifier=identifier; [self setUserInteractionEnabled:YES]; _backgroundImage= [[UIImageView alloc] init]; _tapGR=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(itemTaped)]; } return self; }
而後重寫setFrame方法:事件
-(void)setFrame:(CGRect)frame { [super setFrame:frame]; [_backgroundImage setFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; _backgroundImage.tag=10099; }
這樣使得item在改變大小時背景可以同樣進行變化。接下來重寫layoutSubviews方法get
-(void)layoutSubviews { [super layoutSubviews]; if([self viewWithTag:10099]== nil) { [self addSubview:_backgroundImage]; [self sendSubviewToBack:_backgroundImage]; } [self addGestureRecognizer:_tapGR]; }
點擊事件的實現經過手勢來實現:it
-(void)itemTaped{ [(iCollectionView *)[self superview] itemClickedAtPoint:self.point]; }
以後是能夠由子類重寫的方法io
#pragma mark - #pragma mark override -(void)reset{ }