IOS实现自定义布局瀑布流

2020-01-14 18:52:33刘景俊

布局指定区域内所有的元素


- (nullable NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{
  //返回所有元素的布局属性
  return self.attrsArray;
}

通过xib自定义ce ll
设置成员属性,保存cell内部的图片

/**图片名字*/


@property (nonatomic, copy) NSString *imageName;

初始化cell


- (void)awakeFromNib
{
  //通过Layer设置边框
  self.imageView.layer.borderColor = [UIColor whiteColor].CGColor;
  self.imageView.layer.borderWidth = 6;
  self.imageView.layer.cornerRadius = 3;
}

设置cell内imageView的image属性


- (void)setImageName:(NSString *)imageName
{
  _imageName = [imageName copy];
  self.imageView.image = [UIImage imageNamed:imageName];
}

加载图片资源
通过成员属性,保存所有的图片名


/**所有的图片*/
@property (nonatomic, strong) NSMutableArray *imageNames;

懒加载,初始化图片名数组


- (NSMutableArray *)imageNames
{
  if (_imageNames == nil)
  {
    NSMutableArray *imageNames = [NSMutableArray array];
    for (NSInteger i = 0; i<20; i++)
    {
      NSString *imageName = [NSString stringWithFormat:@"%zd", i + 1];
      [imageNames addObject:imageName];
    }
    _imageNames = imageNames;
  }
  return _imageNames;
}

创建UICollectionView
通过成员属性保存UICollectionView对象,以便更改布局


@property (nonatomic, weak) UICollectionView *collectionView;

创建并设置collectionView


- (void)setupCollectionView
{
  //设置frame
  CGFloat collectionViewW = self.view.bounds.size.width;
  CGFloat collectionViewH = 200;
  CGRect frame = CGRectMake(0, 150, collectionViewW, collectionViewH);

  //创建布局
  LYPCircleLayout *layout = [[LYPCircleLayout alloc] init];

  //创建collectionView
  UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:frame collectionViewLayout:layout];
  self.collectionView = collectionView;

  //设置collectionView的数据源和代理
  collectionView.dataSource = self;
  collectionView.delegate = self;

  //添加collectionView到控制器的view中
  [self.view addSubview:collectionView];
}

实现UICollectionView的数据源方法