我说一下我的一些看法。
首先这个功能模块是比较复杂的,如果要把它写好,是需要一定难度的,目前Github上综合排名第一的是TZImagePickerController,紧随其后的是HXPhotoPicker,因为TZImagePickerController年久失修,我也研究过源码,感觉很多冗余,作者没有时间维护,基本上是死库。 👇这个是我向TZImagePickerController提issues的内容,被close,所以迫不得已研究HXPhotoPicker https://github.com/banchichen/TZImagePickerController/issues/1454
不得不说HXPhotoPicker领先于TZImagePickerController,虽然star想较少,但是考虑到TZImagePickerController先推出就不说了。
下面来聊聊我的看法 代码冗余还是存在,不同程度的存在,某些功能实现较为复杂,代码逻辑不清,我研究了几个小时,还是有点昏。毕竟这个 HXPhotoPicker是从2017年开始起来的,我几个小时能吃透很难。 1、重构的时候尽量使用懒加载 2、最好全局有一个公共配置文件,在Appdelegate里面实现,在局部允许自定义配置,局部自定义的优先级要高于全局配置; 3、UI的Collection 的一些效果,我建议你不要自己写,你直接引用库:https://github.com/liangdahong/BMLongPressDragCellCollectionView 4、鉴权的操作,我也建议你不要自己写,建议用库:https://github.com/EchoZuo/ECAuthorizationTools/blob/master/README.md 5、你这个个工具需要做的事情希望单一化:就是取数据(视频、静态图、gif)获取权限、UI拖拉拽动画这些,直接进行剥离; ....或者你一定要自己写可以,分离成子Pod来处理。我以上建议的两个库都不算差,可以适当评估; 6、这样做有一个好处,可以减少用户实际代码当中的冗余成分。 7、尽量减少继承,用户要用的时候必须继承才行,这样就有了入侵,我看你用分类挺好的,这也是领先TZImagePickerController的一个点;
我们来说一说Bug 就截止目前我将#define HXPhotoViewCustomItemSize 1,甚至将// itemW = 200;都无效,UI逻辑混乱,我学习成本过高。所以建议你将UI部分剥离就这个道理。
还有,在HXPhotoViewProtocol.h这个文件前面包含一下:#import <Photos/Photos.h> 因为编译期的顺序问题,某些情况会爆红。因为里面涉及到PHAsset
在某些机型上不适配
这个图片是在机型iPhone 11 ,系统14.2
上面的刘海屏不适配
不错的建议,里面确实有一些功能写的很复杂,之前也有想着重构,由于个人时间和精力有限就搁置了。 目前正在用Swift进行重写,可以看看Swift版本,有好的建议和想法都会采纳。如你有兴趣的也可以一起参与进来😁
按钮布局问题应该是我改没有更新git的原因,用demo运行应该没这个布局的问题吧
-(void)loadView{ [super loadView]; DDPostDelViewHeight = BottomSafeAreaHeight() + 50; // 获取保存在本地文件中的模型数组 @weakify(self) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ @strongify(self) Ivar ivar = class_getInstanceVariable([HXPhotoManager class], "_endSelectedList");//必须是下划线接属性 NSArray *f = [self.photoManager getLocalModelsInFile];//HXPhotoModel if (f.count) { object_setIvar(self.photoManager, ivar, f);
dispatch_async(dispatch_get_main_queue(), ^{
if (self.photoManager.localModels.count) {
[self.postPhotoView refreshView];
}
});
}
NSLog(@"self.localModels = %@",self.photoManager.localModels);
});
}
会崩溃啊。
我就在本页面刷新,你的架构是和上个页面有粘连。
不错的建议,里面确实有一些功能写的很复杂,之前也有想着重构,由于个人时间和精力有限就搁置了。 目前正在用Swift进行重写,可以看看Swift版本,有好的建议和想法都会采纳。如你有兴趣的也可以一起参与进来😁
swift我是弟弟。我的时间很忙,我不能保证时间
你下次重构的时候,尽量懒加载属性,属性这么写
@property(nonatomic,strong)NSMutableArray <DDInvitationModel *>*dataMutArr;
这样清晰定位
懒加载用的时候在加载不重要,往后靠
我的通常做法是卸载一个文件最屁股后面

还有最新版的xcode 要求强烈规范语法,刷新UI必须回调到主线程,否则crash
-(void)loadView{ [super loadView]; DDPostDelViewHeight = BottomSafeAreaHeight() + 50; // 获取保存在本地文件中的模型数组 @weakify(self) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ @strongify(self) Ivar ivar = class_getInstanceVariable([HXPhotoManager class], "_endSelectedList");//必须是下划线接属性 NSArray *f = [self.photoManager getLocalModelsInFile];//HXPhotoModel if (f.count) { object_setIvar(self.photoManager, ivar, f);
dispatch_async(dispatch_get_main_queue(), ^{ if (self.photoManager.localModels.count) { [self.postPhotoView refreshView]; } }); } NSLog(@"self.localModels = %@",self.photoManager.localModels); });}
会崩溃啊。
我就在本页面刷新,你的架构是和上个页面有粘连。
问题解决了 看了你的demo10 我想简单了。
哎呀 我好想给你重构啊 但是取相片那一套流程又不熟悉。 要不你写个思维导图或者流程图来,中间过程有哪些,要涉及到那几个方法,那几个参数。
感觉存数据这一块也有点看不懂呢?
1、archiver 完了以后你再存文件,但是这个data是alloc init的和self.afterSelectedArray有什么关系呢?
HXPhotoView不能用masonry只能用frame,因为你里面的collection是依据有多少个cell来自适应的,当然还有一些其他的操作,我没看,直接导致频繁刷新界面,频繁调用viewWillLayoutSubviews
https://github.com/QuintGao/GKNavigationBar/issues/61
老哥写这么多辛苦了,之前因为很多事情所以没有仔细看。现在有点时间可以看怎么进行优化了。谢谢老哥提的建议
去年重新写swift版的时候,发现了oc版本里很一些逻辑有问题的,想要在oc基础上优化有点复杂,我看后面怎么一点一点的重写替换了
主线还是你来写,我的开发任务很重,我是组长。我封装好的一些的东西在我的github里面。可以交流下,我这个人有很严重的代码洁癖,我遇到不舒服的我宁可重写都要推翻,我的一些框架都推翻重来很多次了,每一次都在更新,我极少在原基础上更改。我的洁癖到了命名和项目结构,强迫症活着真累
HXPhotoModel 这个里面建议加个NSData 类型
我用我之前的库解决了:你去看我的库里面找@interface FileFolderHandleTool : NSObject这个类
我大概说下:
@interface FileFolderHandleModel : NSObject
@property(nonatomic,strong,nullable)AVAsset *asset; @property(nonatomic,strong,nullable)AVAudioMix *audioMix; @property(nonatomic,strong,nullable)NSDictionary *info; @property(nonatomic,strong,nullable)NSData *data; @property(nonatomic,strong,nullable)UIImage *image;
@end
///仅获取PHAsset里面的视频 +(void)getVedioFromPHAsset:(PHAsset *)phAsset complete:(MKDataBlock)completeBlock{ if (phAsset.mediaType == PHAssetMediaTypeVideo) { PHVideoRequestOptions *options = PHVideoRequestOptions.new; options.version = PHImageRequestOptionsVersionCurrent; options.deliveryMode = PHVideoRequestOptionsDeliveryModeAutomatic;
PHImageManager *manager = PHImageManager.defaultManager;
[manager requestAVAssetForVideo:phAsset options:options
resultHandler:^(AVAsset * _Nullable asset,
AVAudioMix * _Nullable audioMix,
NSDictionary * _Nullable info) {
AVURLAsset *urlAsset = (AVURLAsset *)asset;
FileFolderHandleModel *fileFolderHandleModel = FileFolderHandleModel.new;
fileFolderHandleModel.asset = asset;
fileFolderHandleModel.audioMix = audioMix;
fileFolderHandleModel.info = info;
fileFolderHandleModel.data = [FileFolderHandleTool AVAssetToData:asset];
fileFolderHandleModel.image = [UIImage getVideoPreViewImage:urlAsset];
if (completeBlock) {
completeBlock(fileFolderHandleModel);
}
}];
}
}
还有很多诸如此类的.....
需求:我要获取你的HXPhotoSubViewCell更改背景”➕“的图片 获取方法我看到有:- (HXPhotoSubViewCell *)collectionViewCellWithIndex:(NSInteger)index; 看你的实现,其实不是真正的获取,你必须在有值的情况下才可以被触发,因为你的!self.dataList.count条件 我现在的做法是:
在我的主类控制器里面: -(void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; HXPhotoSubViewCell *cell = (HXPhotoSubViewCell *)[self.postPhotoView.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]; if (cell) { cell.imageView.image = KIMG(@"选择资源➕"); } }
HXPhotoViewCellCustomProtocol 这个协议是自定义view,而我这里不需要自定义,就只需要微调HXPhotoSubViewCell
添加图片有暴露属性修改的