[iOS]自定義UICollectionView 1--CollectionItem的實現

在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{
}
相關文章
相關標籤/搜索