UICollectionView布局cell的三种方式

UICollectionViewFlowLayout里面:

 // 方法一
- (void)prepareLayout{}
// 方法二:可以修改宽度,不能修改高度
- (nullable NSArray<__kindof UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect

贴出具体代码,注意方法二,要和一个带bool返回值的方法一块用:

 class CoverFlowLayout: UICollectionViewFlowLayout {

     // MARK: - 准备布局
override func prepare() {
super.prepare() scrollDirection = .horizontal let itemH = (collectionView?.bounds.size.height ?? ) * 0.8
let itemW = itemH
itemSize = CGSize(width: itemW, height: itemH) minimumLineSpacing =
} // MARK: - 只要显示的区域发生变化,就重新计算布局
// true - 只要显示的区域发生改变,就让布局失效; -> 重新计算布局,执行下面的方法
override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
return true
} // MARK: - 布局某表Rect中的所有cell
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { // 先获取系统布局好的结果
let oldAttsArray = super.layoutAttributesForElements(in: rect)! // 创建新集合
var tempArray = [UICollectionViewLayoutAttributes]() // 遍历集合,进行修改
for oldAtt in oldAttsArray{ // 这里不能直接修改,需先copy(否则控制台会输出错误)
let newAtt = oldAtt.copy() as! UICollectionViewLayoutAttributes // 屏幕中线位置
let screenCenterX = (collectionView?.bounds.size.width ?? ) * 0.5 + (collectionView?.contentOffset.x ?? ) // cell的中线
let itemCenterX = newAtt.center.x // 计算距离
let distance = screenCenterX - itemCenterX // 将距离转换成缩放比例
let scale = - abs(distance) / (collectionView?.bounds.size.width ?? ) let transform = CATransform3DIdentity
newAtt.transform3D = CATransform3DScale(transform, scale, scale, ) tempArray.append(newAtt)
} return tempArray
} }

协议方法 UICollectionViewDelegateFlowLayout:

 // 方法三:返回cell的size
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
if (indexPath.section == ) { //第0组
return CGSizeMake(collectionView.bounds.size.width, );
} if (indexPath.section == && indexPath.item == ) { //第一组的第0个
return CGSizeMake(collectionView.bounds.size.width, );
} CGFloat width = (collectionView.bounds.size.width - ) / ;
CGFloat height = ;
return CGSizeMake(width, height);
}
上一篇:【leetcode】 Unique Path ||(easy)


下一篇:ZOJ Monthly, June 2014 月赛BCDEFGH题题解