iOS 自定义九宫格,行、列可变
2015-12-14 14:57
411 查看
项目开发中,难免会遇到类似于九宫格这样的布局。很多元素均匀排列,对于一页展示不完的用滚动视图展示。这种一般用于有几大功能模块,或者电子商务方面商品展示。实现方式有多种,但各有局限性。下面就我知道的做一下简单总结,如有更好的意见,希望能家一起交流,学习!
1、当视图所需滚动方向是上下滚动时,可利用UITabelView,在其cell上添加自定义元素实现。(优点:利用这种方式,不用担心每个自定义 cell会因为屏幕大小的不同而产生缩放比例不协调导致视图变形 ,因为在不同的手机型号上,UITabelView自己有对cell的显示进行处理,大屏幕相应放大,小屏幕相应缩小;缺点:由于系统的UITabelView是默认支持上下滚动的,所以所得九宫格视图只支持上下滚动)。
2、使用UICollectionView实现九宫格视图,
3、完全自定义视图(优点:可完全按照自身想法进行布局等;缺点:在匹配各机型屏幕上会比较繁琐);
下面将自定义布局部分的代码附上,希望大家多多指点!
#import "SquaresView.h"
#define DEVICE_WIDTH [UIScreen mainScreen].bounds.size.width
#define DEVICE_HEIGHT [UIScreen mainScreen].bounds.size.height
#define ITEMS_X 3
#define ITEMS_Y 4
#define GAP_LEFT 30
#define GAP_TOP 10
#define CELL_WIDTH self.frame.size.width*1.0/ITEMS_Y-2*GAP_LEFT
#define CELL_HEIGHT (self.frame.size.height*1.0/ITEMS_X-2*GAP_TOP)
@interface
SquaresView()<UIScrollViewDelegate>
@property (nonatomic,strong)UIPageControl *pageControl;
@end
@implementation SquaresView
{
UIScrollView *squareContent;
NSInteger number;
NSInteger pages;
NSInteger currentPage;
NSInteger currentRow;
}
-(id)init{
self = [superinit];
if (self) {
squareContent = [[UIScrollViewalloc]init];
squareContent.scrollEnabled =YES;
squareContent.delegate =self;
//
设置整页滚动
squareContent.pagingEnabled =YES;
squareContent.bounces =NO;
squareContent.showsHorizontalScrollIndicator =NO;
[selfaddSubview:squareContent];
number =
0;
currentPage =
0;
currentRow =
0;
}
return
self;
}
- (void)drawRect:(CGRect)rect {
[selfreloadData];
//创建UIPageControl对象
UIPageControl *pageControl = [[UIPageControlalloc]init];
self.pageControl = pageControl;
pageControl.frame =CGRectMake(0,self.frame.size.height+20,DEVICE_WIDTH,
30);
//配置pageControl
pageControl.numberOfPages =pages;
pageControl.pageIndicatorTintColor = [UIColorlightGrayColor];
pageControl.currentPageIndicatorTintColor = [UIColorblackColor];
//将页面控制器视图添加到self.View中
[selfaddSubview:pageControl];
}
-(void)reloadData{
//设置九宫格内容视图frame
squareContent.frame =CGRectMake(0,0,
self.frame.size.width,self.frame.size.height);
number = [self.squareVGieDatasourcenumberOfCells];
NSInteger items =
ITEMS_X*ITEMS_Y;
//确定有多少页
if (number<=items) {
pages =
1;
}else{
if (number%items!=0){
pages =
number/items+1;
}else{
pages =
number/items;
}
}
squareContent.contentSize =CGSizeMake(ITEMS_Y*pages*(CELL_WIDTH+2*GAP_LEFT),ITEMS_X*(CELL_HEIGHT+2*GAP_TOP));
//确定每个cell的frame
NSMutableArray *frameArray = [[NSMutableArrayalloc]init];
for (int i =0; i <
number; i++) {
//cell个数确定行列数
NSInteger row =
0;
NSInteger low =
0;
//确定当前cell所在页面以判断所在列数和行数
currentPage = i/items;
row = (i-currentPage*items)/ITEMS_Y;
low = i%ITEMS_Y+ITEMS_Y*currentPage;
CGRect frame =CGRectMake(GAP_LEFT+low*(CELL_WIDTH+2*GAP_LEFT),GAP_TOP+row*(CELL_HEIGHT+2*GAP_TOP),CELL_WIDTH,
CELL_HEIGHT);
[frameArrayaddObject:[NSValuevalueWithCGRect:frame]];
}
//创建cell
NSInteger counter =
0;
for (NSValue *valuein frameArray) {
CGRect frame = [value
CGRectValue];
SquareCell *squareCell = [self.squareVGieDatasourcecellForIndex:counter
squareView:self];
squareCell.itemBtn.tag = counter;
squareCell.squareView =self;
[squareCellsetFrame:frame];
[squareContentaddSubview:squareCell];
counter++;
}
}
#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
//确定当前所在页面的下标
CGPoint p = scrollView.contentOffset;
NSUInteger index = p.x/self.frame.size.width;
self.pageControl.currentPage = index;
}
@end
1、当视图所需滚动方向是上下滚动时,可利用UITabelView,在其cell上添加自定义元素实现。(优点:利用这种方式,不用担心每个自定义 cell会因为屏幕大小的不同而产生缩放比例不协调导致视图变形 ,因为在不同的手机型号上,UITabelView自己有对cell的显示进行处理,大屏幕相应放大,小屏幕相应缩小;缺点:由于系统的UITabelView是默认支持上下滚动的,所以所得九宫格视图只支持上下滚动)。
2、使用UICollectionView实现九宫格视图,
3、完全自定义视图(优点:可完全按照自身想法进行布局等;缺点:在匹配各机型屏幕上会比较繁琐);
下面将自定义布局部分的代码附上,希望大家多多指点!
#import "SquaresView.h"
#define DEVICE_WIDTH [UIScreen mainScreen].bounds.size.width
#define DEVICE_HEIGHT [UIScreen mainScreen].bounds.size.height
#define ITEMS_X 3
#define ITEMS_Y 4
#define GAP_LEFT 30
#define GAP_TOP 10
#define CELL_WIDTH self.frame.size.width*1.0/ITEMS_Y-2*GAP_LEFT
#define CELL_HEIGHT (self.frame.size.height*1.0/ITEMS_X-2*GAP_TOP)
@interface
SquaresView()<UIScrollViewDelegate>
@property (nonatomic,strong)UIPageControl *pageControl;
@end
@implementation SquaresView
{
UIScrollView *squareContent;
NSInteger number;
NSInteger pages;
NSInteger currentPage;
NSInteger currentRow;
}
-(id)init{
self = [superinit];
if (self) {
squareContent = [[UIScrollViewalloc]init];
squareContent.scrollEnabled =YES;
squareContent.delegate =self;
//
设置整页滚动
squareContent.pagingEnabled =YES;
squareContent.bounces =NO;
squareContent.showsHorizontalScrollIndicator =NO;
[selfaddSubview:squareContent];
number =
0;
currentPage =
0;
currentRow =
0;
}
return
self;
}
- (void)drawRect:(CGRect)rect {
[selfreloadData];
//创建UIPageControl对象
UIPageControl *pageControl = [[UIPageControlalloc]init];
self.pageControl = pageControl;
pageControl.frame =CGRectMake(0,self.frame.size.height+20,DEVICE_WIDTH,
30);
//配置pageControl
pageControl.numberOfPages =pages;
pageControl.pageIndicatorTintColor = [UIColorlightGrayColor];
pageControl.currentPageIndicatorTintColor = [UIColorblackColor];
//将页面控制器视图添加到self.View中
[selfaddSubview:pageControl];
}
-(void)reloadData{
//设置九宫格内容视图frame
squareContent.frame =CGRectMake(0,0,
self.frame.size.width,self.frame.size.height);
number = [self.squareVGieDatasourcenumberOfCells];
NSInteger items =
ITEMS_X*ITEMS_Y;
//确定有多少页
if (number<=items) {
pages =
1;
}else{
if (number%items!=0){
pages =
number/items+1;
}else{
pages =
number/items;
}
}
squareContent.contentSize =CGSizeMake(ITEMS_Y*pages*(CELL_WIDTH+2*GAP_LEFT),ITEMS_X*(CELL_HEIGHT+2*GAP_TOP));
//确定每个cell的frame
NSMutableArray *frameArray = [[NSMutableArrayalloc]init];
for (int i =0; i <
number; i++) {
//cell个数确定行列数
NSInteger row =
0;
NSInteger low =
0;
//确定当前cell所在页面以判断所在列数和行数
currentPage = i/items;
row = (i-currentPage*items)/ITEMS_Y;
low = i%ITEMS_Y+ITEMS_Y*currentPage;
CGRect frame =CGRectMake(GAP_LEFT+low*(CELL_WIDTH+2*GAP_LEFT),GAP_TOP+row*(CELL_HEIGHT+2*GAP_TOP),CELL_WIDTH,
CELL_HEIGHT);
[frameArrayaddObject:[NSValuevalueWithCGRect:frame]];
}
//创建cell
NSInteger counter =
0;
for (NSValue *valuein frameArray) {
CGRect frame = [value
CGRectValue];
SquareCell *squareCell = [self.squareVGieDatasourcecellForIndex:counter
squareView:self];
squareCell.itemBtn.tag = counter;
squareCell.squareView =self;
[squareCellsetFrame:frame];
[squareContentaddSubview:squareCell];
counter++;
}
}
#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
//确定当前所在页面的下标
CGPoint p = scrollView.contentOffset;
NSUInteger index = p.x/self.frame.size.width;
self.pageControl.currentPage = index;
}
@end
相关文章推荐
- fir.im Weekly - 94 个 iOS 开发资源推荐
- 关于目前自己iOS项目使用的第三方开源库
- iOS检查更新
- iOS 笔记-AFN使用中的遇到的问题
- fir.im Weekly - 94 个 iOS 开发资源推荐
- iOS 笔记-incompatible pointer types initializing 'NSMutableString *' with an expression of type 'NSString *'警告处理
- IOS NSString比较,截取,NSLog,NSRang,isEqualToString,stringWithFormat
- iOS ---清除缓存
- iOS 获取快递物流信息(GCD异步加载)
- IOS开发 判断是否是非法字符 例如表情符号
- iOS 开发判断应用是否连接WiFi,并跳转到设置中的WiFi设置页面。
- IOS开发 小技能
- ios push 推送证书及合并
- 用HTML5写的视频,在IOS应应用中可以打开,在安卓应用中打不开。
- Xcode插件神器
- iOS 页面跳转动画CATransition详细分析
- IOS开发 扫描二维码
- IOS开发 生成二维码
- iOS中如何创建一个滑出式导航面板(1)
- 【iOS】获取应用版本和语言