开发日志 10-day
参数越界报错
- ‘NSInvalidArgumentException’, reason: ‘-[NSInvocation setArgument:atIndex:]: index (2) out of bounds [-1, 1]’
* First throw call stack:
- 其中NSInvocation代表回调,调用的意思,一般值调用某种方法,setArgument:atIndex代表某种参数。
- 这个报错意思是参数越界
PHotos框架详解
- 判断状态
PHAuthorizationStatusNotDetermined = 0, // 用户还没做出选择
PHAuthorizationStatusRestricted, // 用户拒绝当前应用访问相册
PHAuthorizationStatusDenied, // 用户允许
PHAuthorizationStatusAuthorized // 家长控制
- PHAsset : 一个资源, 比如一张图片\一段视频
PHAssetCollection : 一个相簿 PHAssetCollection的标识, 利用这个标识可以找到对应的PHAssetCollection对象(相簿对象)
__block NSString *assetCollectionLocalIdentifier = nil;
PHAsset的标识, 利用这个标识可以找到对应的PHAsset对象(图片对象)
__block NSString *assetLocalIdentifier = nil;
如果想对”相册”进行修改(增删改), 那么修改代码必须放在[PHPhotoLibrary sharedPhotoLibrary]的performChanges方法的block中
使用技巧
- 保存照片到相机胶卷中,创建图片请求 PHAssetCreationRequest
- 创建相簿
获得创建相簿
- fetchAssetCollectionsWithType 抓取所有相簿,返回相簿集合,然后通过for循环找到相应相簿
for (PHAssetCollection *assetCollection in assetCollections) { if ([assetCollection.localizedTitle isEqualToString:MYAssetCollectionTitle]) { return assetCollection; } }
获得照片 (通过标识获得图片)
PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetLocalIdentifier] options:nil].lastObject;
添加相机胶卷的照片到相簿请求
PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
添加图片到相簿
[request addAssets:@[asset]];
AFN知识补充
- block 强引用
[AFHTTPSessionManager manager]GET:<#(nonnull NSString *)#> parameters:<#(nullable id)#> progress:<#^(NSProgress * _Nonnull downloadProgress)downloadProgress#> success:<#^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)success#> failure:<#^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)failure#>
- 如果使用强引用的block 访问外部对象,则只要执行完block代码才会挂掉,比如用户在网络还没读完数据就退出界面,block中的网络读取还会继续进行
- 解决方法: __weak typeof(self) weakSelf = self;
- 取消请求
[AFHTTPSessionManager manager] invalidateSessionCancelingTasks:YES];
设置圆形图片
- 可以扩展uiimage简化代码
- 利用Quartz 2D
// 开启图形上下文
UIGraphicsBeginImageContext(self.size);
// 上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
// 添加一个圆
CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
CGContextAddEllipseInRect(ctx, rect);
// 裁剪
CGContextClip(ctx);
// 绘制图片
[self drawInRect:rect];
// 获得图片
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
// 关闭图形上下文
UIGraphicsEndImageContext();