解决Block的循环引用、链式编程、({})的使用、有关UICollectionViewFlowLayout重新布局

1.解决Block的循环引用

__weak typeof(self) weakSelf = self;
__strong typeof(weakSelf) strongSelf = weakSelf;

// 具体使用案例
__weak typeof(self) weakSelf = self;
    
_block = ^{
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            __strong typeof(weakSelf) strongSelf = weakSelf;
            NSLog(@"%@",strongSelf);
        });
        
    };

2.链式编程

.h文件

#import 

@interface CacutorManager : NSObject

@property(nonatomic, assign) int result;
- (CacutorManager *(^)(int)) add;
@end

.m文件

#import "CacutorManager.h"

@implementation CacutorManager
- (CacutorManager *(^)(int))add{
    return  ^(int value){
        _result += value;
        return self;
    };
    
}
@end

使用

 CacutorManager *mgr = [[CacutorManager alloc]init];
 mgr.add(5).add(5);
 NSLog(@"%d",mgr.result);

3.({})的使用

int c = ({
        int a = 9;
        int b = 9;
        a + b;
    });
    NSLog(@"c = %d",c);

4.有关UICollectionViewFlowLayout

- (nullable NSArray<__kindof UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{
    // 1.获取当前显示Cell的布局
    NSArray *attrs = [super layoutAttributesForElementsInRect:self.collectionView.bounds];
    for (UICollectionViewLayoutAttributes *attr in attrs) {
        // 2.计算距离中心点距离
        CGFloat date = fabs((attr.center.x - self.collectionView.contentOffset.x) - self.collectionView.bounds.size.width * 0.5);
        // 计算缩率
        CGFloat scale =1 - ((date / (self.collectionView.bounds.size.width * 0.5)) * 0.5);
        attr.transform = CGAffineTransformMakeScale(scale, scale);
    }
    return  attrs;
}
// 是否刷新布局
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{
    return true;
}

// 什么时候调用:用户手指一松开就会调用
//作用:切定最终的偏移量
//距离中心点越近,这个cell最终展示中心点
- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity{
   // 拖动比较快 最终偏移量 不等于 手机离开时偏移量
    CGFloat collectionWidth = self.collectionView.bounds.size.width;
    // 最终偏移量
    CGPoint targetP = [super targetContentOffsetForProposedContentOffset:proposedContentOffset withScrollingVelocity:velocity];
    // 0.获取最终显示的区域
    CGRect targetRect = CGRectMake(targetP.x, 0, collectionWidth, MAXFLOAT);
    // 1.获取最终显示的cell
    NSArray *attrs = [super layoutAttributesForElementsInRect:targetRect];
    CGFloat minDelta = MAXFLOAT;
    for (UICollectionViewLayoutAttributes *attr in attrs) {
        // 2.计算距离中心点距离
        CGFloat delta = fabs((attr.center.x - self.collectionView.contentOffset.x) - self.collectionView.bounds.size.width * 0.5);
        if (fabs(delta) < fabs(minDelta)) {
            minDelta = delta;
        }
    }
    targetP.x += minDelta;
    if (targetP.x < 0) {
        targetP.x = 0;
    }
    return targetP;
}

图解:


计算距离中心点距离.png

效果图:

效果图.png

你可能感兴趣的:(解决Block的循环引用、链式编程、({})的使用、有关UICollectionViewFlowLayout重新布局)