HXPhotoPicker icon indicating copy to clipboard operation
HXPhotoPicker copied to clipboard

我说一下我的一些看法。

Open JobsKits opened this issue 5 years ago • 18 comments

首先这个功能模块是比较复杂的,如果要把它写好,是需要一定难度的,目前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部分剥离就这个道理。

JobsKits avatar Jan 01 '21 06:01 JobsKits

还有,在HXPhotoViewProtocol.h这个文件前面包含一下:#import <Photos/Photos.h> 因为编译期的顺序问题,某些情况会爆红。因为里面涉及到PHAsset

JobsKits avatar Jan 01 '21 06:01 JobsKits

HXPhotoPicker 在某些机型上不适配 这个图片是在机型iPhone 11 ,系统14.2

上面的刘海屏不适配

JobsKits avatar Jan 01 '21 08:01 JobsKits

不错的建议,里面确实有一些功能写的很复杂,之前也有想着重构,由于个人时间和精力有限就搁置了。 目前正在用Swift进行重写,可以看看Swift版本,有好的建议和想法都会采纳。如你有兴趣的也可以一起参与进来😁

SilenceLove avatar Jan 01 '21 14:01 SilenceLove

按钮布局问题应该是我改没有更新git的原因,用demo运行应该没这个布局的问题吧

SilenceLove avatar Jan 01 '21 14:01 SilenceLove

-(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);
});

}

会崩溃啊。

我就在本页面刷新,你的架构是和上个页面有粘连。

JobsKits avatar Jan 03 '21 05:01 JobsKits

不错的建议,里面确实有一些功能写的很复杂,之前也有想着重构,由于个人时间和精力有限就搁置了。 目前正在用Swift进行重写,可以看看Swift版本,有好的建议和想法都会采纳。如你有兴趣的也可以一起参与进来😁

swift我是弟弟。我的时间很忙,我不能保证时间

JobsKits avatar Jan 03 '21 05:01 JobsKits

你下次重构的时候,尽量懒加载属性,属性这么写 @property(nonatomic,strong)NSMutableArray <DDInvitationModel *>*dataMutArr; 这样清晰定位 懒加载用的时候在加载不重要,往后靠 我的通常做法是卸载一个文件最屁股后面 Xnip2021-01-03_13-06-59

JobsKits avatar Jan 03 '21 05:01 JobsKits

还有最新版的xcode 要求强烈规范语法,刷新UI必须回调到主线程,否则crash

JobsKits avatar Jan 03 '21 06:01 JobsKits

-(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 我想简单了。

JobsKits avatar Jan 03 '21 06:01 JobsKits

哎呀 我好想给你重构啊 但是取相片那一套流程又不熟悉。 要不你写个思维导图或者流程图来,中间过程有哪些,要涉及到那几个方法,那几个参数。

JobsKits avatar Jan 03 '21 06:01 JobsKits

image 感觉存数据这一块也有点看不懂呢? 1、archiver 完了以后你再存文件,但是这个data是alloc init的和self.afterSelectedArray有什么关系呢?

JobsKits avatar Jan 03 '21 06:01 JobsKits

HXPhotoView不能用masonry只能用frame,因为你里面的collection是依据有多少个cell来自适应的,当然还有一些其他的操作,我没看,直接导致频繁刷新界面,频繁调用viewWillLayoutSubviews

image https://github.com/QuintGao/GKNavigationBar/issues/61

JobsKits avatar Jan 03 '21 13:01 JobsKits

老哥写这么多辛苦了,之前因为很多事情所以没有仔细看。现在有点时间可以看怎么进行优化了。谢谢老哥提的建议

SilenceLove avatar Mar 05 '21 08:03 SilenceLove

去年重新写swift版的时候,发现了oc版本里很一些逻辑有问题的,想要在oc基础上优化有点复杂,我看后面怎么一点一点的重写替换了

SilenceLove avatar Mar 05 '21 08:03 SilenceLove

主线还是你来写,我的开发任务很重,我是组长。我封装好的一些的东西在我的github里面。可以交流下,我这个人有很严重的代码洁癖,我遇到不舒服的我宁可重写都要推翻,我的一些框架都推翻重来很多次了,每一次都在更新,我极少在原基础上更改。我的洁癖到了命名和项目结构,强迫症活着真累

JobsKits avatar Mar 06 '21 14:03 JobsKits

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);
        }
    }];
}

}

还有很多诸如此类的.....

JobsKits avatar Mar 11 '21 09:03 JobsKits

需求:我要获取你的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

JobsKits avatar Mar 12 '21 03:03 JobsKits

image 添加图片有暴露属性修改的

SilenceLove avatar Mar 12 '21 03:03 SilenceLove