在iOS6.0之后的版本中水果加入了UICollectionView控件,但是UICollection并不支持iOS6.0之前的版本。要实现UICollectionView可以有许多方法:可以使用UITableView,通过自定义UITableViewCell来实现类似UICollectionView的布局样式,也可以通过完全重写UITableView来重新实现一遍(有点重新造轮子的嫌疑)。
这里我们选择后面一种方法来实现,这样可以充分的理解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对比的方法。 在实现文件中首先引入需要的头文件。
#import "iCollectionItem.h"
#import "iCollectionView.h"
@interface iCollectionItem()
@property(strong,nonatomic) UITapGestureRecognizer *tapGR;
@end
初始化方法中对item进行初始化
-(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方法
-(void)layoutSubviews {
[super layoutSubviews];
if([self viewWithTag:10099]== nil) {
[self addSubview:_backgroundImage];
[self sendSubviewToBack:_backgroundImage];
}
[self addGestureRecognizer:_tapGR];
}
点击事件的实现通过手势来实现:
-(void)itemTaped{
[(iCollectionView *)[self superview] itemClickedAtPoint:self.point];
}
之后是可以由子类重写的方法
#pragma mark -
#pragma mark override
-(void)reset{
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。