- (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { _scrollView = [[UIScrollView alloc] initWithFrame:self.bounds]; [self addSubview:_scrollView]; _cellArray = [NSMutableArray array]; _numberOfColumns = 4; _spacing=5; _edgeInset=UIEdgeInsetsMake(20, 0, 20, 0); } return self; } - (void)reloadData { //重新加载数据前需要将老数据清理掉 //获取视图(小格子)的个数 NSInteger count = [_dataSource numberOfViewInPhotoWall:self]; CGFloat width = self.bounds.size.width / _numberOfColumns; CGFloat height = 44.0f; if (_dataSource && [_dataSource respondsToSelector:@selector(photoWall:cellHeightAtIndex:)]) { } //计算滚动视图的大小(有问题,自己算..... 高度不对) int heiCount; if(count%_numberOfColumns) { heiCount=count/_numberOfColumns+1; } else { heiCount=count/_numberOfColumns; } _scrollView.contentInset=_edgeInset; _scrollView.contentSize = CGSizeMake(_scrollView.frame.size.width,heiCount * height); //总数与index相差1 for (NSInteger i = 0; i < count; i++) { MyPhotoWallCell *cell = [_dataSource photoWall:self cellAtIndex:i]; [cell addTarget:self action:@selector(didClicked:) forControlEvents:UIControlEventTouchUpInside]; cell.tag = i; if (_dataSource&&[_dataSource respondsToSelector:@selector(photoWall:cellHeightAtIndex:)]) { height = [_dataSource photoWall:self cellHeightAtIndex:i]; } CGFloat y = (i / _numberOfColumns) * height; NSLog(@"%f--%f", width * i, y); cell.frame = CGRectMake(width * (i % _numberOfColumns), y, width-_spacing, height-_spacing); [_scrollView addSubview:cell]; } } - (void)didClicked:(MyPhotoWallCell *)sender { if (_delegate && [_delegate respondsToSelector:@selector(photoWall:didSelectedIndex:)]) { [_delegate photoWall:self didSelectedIndex:sender.tag]; } } // // ViewController.m // MyCustomPhotoWall // // Created by apple on 14-8-22. // Copyright (c) 2014年 戴维营教育. All rights reserved. // #import "ViewController.h" #import "MyPhotoWallCell.h" #import "MyPhotoWall.h" @interface ViewController () <MyPhotoWallDataSource, MyPhotoWallDelegate> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; MyPhotoWall *photoWall = [[MyPhotoWall alloc] initWithFrame:CGRectMake(10, 10, 300, 460)]; photoWall.backgroundColor = [UIColor redColor]; photoWall.dataSource = self; photoWall.delegate = self; [self.view addSubview:photoWall]; [photoWall reloadData]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (NSInteger)numberOfViewInPhotoWall:(MyPhotoWall *)photoWall { return 100; } - (CGFloat)photoWall:(MyPhotoWall *)photoWall cellHeightAtIndex:(NSInteger)index { if (index%2) { return 94; } else { return 55; } } - (MyPhotoWallCell *)photoWall:(MyPhotoWall *)photoWall cellAtIndex:(NSInteger)index { MyPhotoWallCell *cell = [[MyPhotoWallCell alloc] init]; if (index % 3) { cell.backgroundColor = [UIColor purpleColor]; } else if (index % 2) { cell.backgroundColor = [UIColor magentaColor]; } else { cell.backgroundColor = [UIColor cyanColor]; } // if (index % 2) { // cell.backgroundColor = [UIColor purpleColor]; // } // else { // cell.backgroundColor = [UIColor cyanColor]; // } return cell; } - (void)photoWall:(MyPhotoWall *)photoWall didSelectedIndex:(NSInteger)index { NSLog(@"Selected: %d", index); } @end