美文网首页
解决Block的循环引用、链式编程、({})的使用、有关UICo

解决Block的循环引用、链式编程、({})的使用、有关UICo

作者: 努力奔跑的小男孩 | 来源:发表于2018-08-23 16:07 被阅读21次

    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 <Foundation/Foundation.h>
    
    @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的循环引用、链式编程、({})的使用、有关UICo

          本文链接:https://www.haomeiwen.com/subject/miujiftx.html