環形布局的實現
最終效果
- 圖片依次呈圓形排布
- 每張圖片的中心點都在圓上
實現原理
- 使用自定義布局, 這里創建自定義類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</code></pre>
來自:http://www.jianshu.com/p/f5227ca3a16c