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
网友评论