环形布局的实现

浏览: 92 发布日期: 2017-01-05 分类: ios

最终效果

  1. 图片依次呈圆形排布
  2. 每张图片的中心点都在圆上

实现原理

  • 使用自定义布局, 这里创建自定义类CircleLayout继承自UICollectionViewLayout;
  • 实现-prepareLayout方法,设置每个cell的布局属性,并保存到可变数组中;
  • 实现-layoutAttributesForElementsInRect:方法, 从可变数组中返回每个cell的布局属性;
  • 创建collectionView的时候使用该布局即可以达到cell沿着圆依次排布的效果
#import "CircleLayout.h"

@interface CircleLayout ()
/**属性模型 */
@property (nonatomic, strong) NSMutableArray *attrArray;
@end

@implementation CircleLayout

/** 数组懒加载 */
- (NSMutableArray *)attrArray
{
    if (!_attrArray) {
        _attrArray = [NSMutableArray array];
    }
    return _attrArray;
}

- (void)prepareLayout
{
    [super prepareLayout];

    // cell的个数
    NSInteger itemCount = [self.collectionView numberOfItemsInSection:0];

    // cell的大小
    CGSize itemSize = CGSizeMake(80, 80);

    // 圆心的位置(以collectionView的左上角为原点)
    CGFloat circle_center_X = self.collectionView.frame.size.width * 0.5;
    CGFloat circle_center_Y = self.collectionView.frame.size.height * 0.5;

    // 圆心的半径
    CGFloat radius = 150;

    // 总的item个数 / 360℃
    CGFloat angle = 2 * M_PI / itemCount;

    for (int i = 0; i < itemCount; i++) {

        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];

        // 为每个位置的cell创建布局属性
        UICollectionViewLayoutAttributes *attr = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];

        // 设置cell的大小
        attr.size = itemSize;

        // 设置cell的中心点
        CGFloat centerX = circle_center_X + sin(angle * i) * radius;
        CGFloat centerY = circle_center_Y + cos(angle * i) * radius;
        attr.center = CGPointMake(centerX, centerY);

          // 添加到布局属性的数组里
        [self.attrArray addObject:attr];
    };
}

/** 返回每个cell的布局属性 */
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{   
    return self.attrArray;
}
@end

 

来自:http://www.jianshu.com/p/f5227ca3a16c

 

返回顶部