Bladeren bron

1. 部分交互

huangxiaodong 1 jaar geleden
bovenliggende
commit
df8d0a14da

+ 7 - 0
创维盒子/双子星云手机/Class/Set/uploadFile/PhotoPreviewViewController.h

@@ -7,12 +7,19 @@
 
 #import "BaseViewController.h"
 #import "TZImageManager.h"
+#import "TZAssetModel+imageData.h"
 
 NS_ASSUME_NONNULL_BEGIN
 
 @interface PhotoPreviewViewController : BaseViewController
 @property (strong, nonatomic) NSMutableArray *assets;
 @property (nonatomic, assign) NSInteger currentIndex;///< Index of the photo user click / 用户点击的图片的索引
+//选中的项 TZAssetModel
+@property (nonatomic, strong) NSMutableArray *indexPathsForSelectedItems;
+//最多选择项
+@property (nonatomic, assign) NSInteger maximumNumberOfSelection;
+//最少选择项
+@property (nonatomic, assign) NSInteger minimumNumberOfSelection;
 @end
 
 NS_ASSUME_NONNULL_END

+ 48 - 0
创维盒子/双子星云手机/Class/Set/uploadFile/PhotoPreviewViewController.m

@@ -65,10 +65,58 @@
     but.selected = !but.selected;
 }
 
+#pragma mark 处理点击选中相关
+- (void)handlCellSelectFun
+{
+    
+    TZAssetModel *model = self.assets[_currentIndex];
+    
+    //超出最大限制
+    if (self.indexPathsForSelectedItems.count >= self.maximumNumberOfSelection ) {
+        return;
+    }
+    
+    //取消选中
+    if ([self.indexPathsForSelectedItems containsObject:model]) {
+        [self.indexPathsForSelectedItems removeObject:model];
+        model.isSelected = NO;
+    }
+    else{//选中
+        [self.indexPathsForSelectedItems addObject:model];
+        model.isSelected = NO;
+    
+        if(!model.imageData)
+        {
+            [[PHImageManager defaultManager] requestImageDataForAsset:model.asset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
+                    // 直接得到最终的 NSData 数据
+                    if (imageData) {
+                        model.imageData = imageData;
+                    }
+                
+                [self setDataToBottomViewFun];
+            }];
+        }
+    }
+    
+    
+    [self setDataToBottomViewFun];
+    [self refreshNaviBarAndBottomBarState];
+}
+
+#pragma mark 同步数据到底部
+- (void)setDataToBottomViewFun
+{
+    self.photoPreViewBottomV.indexPathsForSelectedItems = self.indexPathsForSelectedItems;
+}
+
 #pragma mark 刷新导航栏的UI
 - (void)refreshNaviBarAndBottomBarState
 {
     self.titleLabel.text = [[NSString alloc] initWithFormat:@"%ld/%ld",(_currentIndex+1),_assets.count];
+    
+    TZAssetModel *model = self.assets[_currentIndex];
+    
+    self.selectButton.selected = model.isSelected;
 }
 
 - (void)setupPhotoPreviewNavBarView

+ 16 - 0
创维盒子/双子星云手机/Class/Set/uploadFile/model/TZAssetModel+imageData.h

@@ -0,0 +1,16 @@
+//
+//  TZAssetModel+imageData.h
+//  隐私保护
+//
+//  Created by xd h on 2023/11/11.
+//
+
+#import "TZAssetModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface TZAssetModel (imageData)
+@property (nonatomic, retain) NSData *imageData;
+@end
+
+NS_ASSUME_NONNULL_END

+ 19 - 0
创维盒子/双子星云手机/Class/Set/uploadFile/model/TZAssetModel+imageData.m

@@ -0,0 +1,19 @@
+//
+//  TZAssetModel+imageData.m
+//  隐私保护
+//
+//  Created by xd h on 2023/11/11.
+//
+
+#import "TZAssetModel+imageData.h"
+#import <objc/runtime.h>
+
+@implementation TZAssetModel (imageData)
+
+- (void)setImageData:(NSData *)imageData {
+    objc_setAssociatedObject(self, @selector(imageData), imageData, OBJC_ASSOCIATION_RETAIN);
+}
+- (NSString *)imageData {
+    return objc_getAssociatedObject(self, @selector(imageData));
+}
+@end

+ 3 - 1
创维盒子/双子星云手机/Class/Set/uploadFile/photoView/photoPreViewBottomView.h

@@ -6,11 +6,13 @@
 //
 
 #import <UIKit/UIKit.h>
+#import "TZImageManager.h"
 
 NS_ASSUME_NONNULL_BEGIN
 
 @interface photoPreViewBottomView : UIView
-
+//选中的项
+@property (nonatomic, strong) NSMutableArray *indexPathsForSelectedItems;
 @end
 
 NS_ASSUME_NONNULL_END

+ 55 - 17
创维盒子/双子星云手机/Class/Set/uploadFile/photoView/photoPreViewBottomView.m

@@ -6,6 +6,7 @@
 //
 
 #import "photoPreViewBottomView.h"
+#import "TZAssetModel+imageData.h"
 
 @interface photoPreViewBottomView ()
 @property(nonatomic,strong)UILabel *selectNumLabel;
@@ -39,23 +40,7 @@
         make.height.mas_equalTo(50);
     }];
     
-    NSString *curStr1 = [NSString stringWithFormat:@"%@",@"已选0项"];
-    NSString *curStr2 = [NSString stringWithFormat:@"%@",@"(0kb,可用120.00GB)"];
-    NSString *totalStr = [[NSString alloc] initWithFormat:@"%@\n%@",curStr1,curStr2];
-    
-    NSMutableAttributedString *noteStr = [[NSMutableAttributedString alloc] initWithString:totalStr];
-    
-    NSRange redRange = NSMakeRange([totalStr rangeOfString:curStr2].location, [totalStr rangeOfString:curStr2].length);
-    //[noteStr addAttribute:NSForegroundColorAttributeName value:[UIColor hwColor:@"#959799" alpha:1.0] range:redRange];
-    [noteStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:14.0] range:redRange];
-    // 设置行间距
-    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
-    [paragraphStyle setLineSpacing:5];        //设置行间距
-    
-    [noteStr addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [totalStr  length])];
-
-    _selectNumLabel.attributedText = noteStr;
-
+    self.indexPathsForSelectedItems = [NSMutableArray new];
     
 //    _uploadFileRoutelabel = [[UILabel alloc] init];
 //    _uploadFileRoutelabel.font = [UIFont systemFontOfSize:14.0];
@@ -113,6 +98,59 @@
     //imageUploadBut.alpha = 0.5;
 }
 
+#pragma mark 数据处理
+- (void)setIndexPathsForSelectedItems:(NSMutableArray *)indexPathsForSelectedItems
+{
+    
+    _indexPathsForSelectedItems = indexPathsForSelectedItems;
+    if(!_indexPathsForSelectedItems){
+        _indexPathsForSelectedItems = [NSMutableArray new];
+    }
+    
+    //TZAssetModel imageData (以字节为单位)
+    NSUInteger allImageData = 0;
+    
+    for (TZAssetModel* model in _indexPathsForSelectedItems) {
+        allImageData += [model.imageData length];
+    }
+    
+    allImageData /= 1024;
+    
+    NSString *byteStr = nil;
+    NSString *unitStr = @"KB";
+    
+    if(allImageData < 1024){
+        byteStr = [[NSString alloc] initWithFormat:@"%ld",allImageData];
+    }
+    else if( allImageData >= 1024 && allImageData < 1024*1024){
+        byteStr = [[NSString alloc] initWithFormat:@"%.1f",allImageData/1024.0];
+        unitStr = @"MB";
+    }
+    else{
+        byteStr = [[NSString alloc] initWithFormat:@"%.2f",allImageData/1024.0/1024.0];
+        unitStr = @"G";
+    }
+    
+    
+    NSString *curStr1 = [NSString stringWithFormat:@"已选%ld项",_indexPathsForSelectedItems.count];
+    NSString *curStr2 = [NSString stringWithFormat:@"(%@%@,可用120.00GB)",byteStr,unitStr];
+    NSString *totalStr = [[NSString alloc] initWithFormat:@"%@\n%@",curStr1,curStr2];
+    
+    NSMutableAttributedString *noteStr = [[NSMutableAttributedString alloc] initWithString:totalStr];
+    
+    NSRange redRange = NSMakeRange([totalStr rangeOfString:curStr2].location, [totalStr rangeOfString:curStr2].length);
+    [noteStr addAttribute:NSForegroundColorAttributeName value:[UIColor hwColor:@"#959799" alpha:1.0] range:redRange];
+    [noteStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:14.0] range:redRange];
+    // 设置行间距
+    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
+    [paragraphStyle setLineSpacing:5];        //设置行间距
+    
+    [noteStr addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [totalStr  length])];
+
+    _selectNumLabel.attributedText = noteStr;
+}
+
+
 #pragma mark 按钮点击
 - (void)didClickButFun:(UIButton*)but
 {

+ 3 - 1
创维盒子/双子星云手机/Class/Set/uploadFile/photoView/uploadFileBottomView.h

@@ -6,11 +6,13 @@
 //
 
 #import <UIKit/UIKit.h>
+#import "TZImageManager.h"
 
 NS_ASSUME_NONNULL_BEGIN
 
 @interface uploadFileBottomView : UIView
-
+//选中的项 TZAssetModel
+@property (nonatomic,strong) NSMutableArray *indexPathsForSelectedItems;
 @end
 
 NS_ASSUME_NONNULL_END

+ 56 - 17
创维盒子/双子星云手机/Class/Set/uploadFile/photoView/uploadFileBottomView.m

@@ -6,6 +6,7 @@
 //
 
 #import "uploadFileBottomView.h"
+#import "TZAssetModel+imageData.h"
 
 @interface uploadFileBottomView ()
 @property(nonatomic,strong)UILabel *selectNumLabel;
@@ -37,23 +38,8 @@
         make.height.mas_equalTo(20);
     }];
     
-    NSString *curStr1 = [NSString stringWithFormat:@"%@",@"已选0项"];
-    NSString *curStr2 = [NSString stringWithFormat:@"%@",@"(0kb,可用120.00GB)"];
-    NSString *totalStr = [[NSString alloc] initWithFormat:@"%@ %@",curStr1,curStr2];
-    
-    NSMutableAttributedString *noteStr = [[NSMutableAttributedString alloc] initWithString:totalStr];
-    
-    NSRange redRange = NSMakeRange([totalStr rangeOfString:curStr2].location, [totalStr rangeOfString:curStr2].length);
-    [noteStr addAttribute:NSForegroundColorAttributeName value:[UIColor hwColor:@"#959799" alpha:1.0] range:redRange];
-    [noteStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:14.0] range:redRange];
-    // 设置行间距
-    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
-    [paragraphStyle setLineSpacing:5];        //设置行间距
-    
-    [noteStr addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [totalStr  length])];
-
-    _selectNumLabel.attributedText = noteStr;
-
+    //设置即得标题
+    self.indexPathsForSelectedItems = [NSMutableArray new];
     
     _uploadFileRoutelabel = [[UILabel alloc] init];
     _uploadFileRoutelabel.font = [UIFont systemFontOfSize:14.0];
@@ -111,6 +97,59 @@
     //imageUploadBut.alpha = 0.5;
 }
 
+
+#pragma mark 数据处理
+- (void)setIndexPathsForSelectedItems:(NSMutableArray *)indexPathsForSelectedItems
+{
+    
+    _indexPathsForSelectedItems = indexPathsForSelectedItems;
+    if(!_indexPathsForSelectedItems){
+        _indexPathsForSelectedItems = [NSMutableArray new];
+    }
+    
+    //TZAssetModel imageData (以字节为单位)
+    NSUInteger allImageData = 0;
+    
+    for (TZAssetModel* model in _indexPathsForSelectedItems) {
+        allImageData += [model.imageData length];
+    }
+    
+    allImageData /= 1024;
+    
+    NSString *byteStr = nil;
+    NSString *unitStr = @"KB";
+    
+    if(allImageData < 1024){
+        byteStr = [[NSString alloc] initWithFormat:@"%ld",allImageData];
+    }
+    else if( allImageData >= 1024 && allImageData < 1024*1024){
+        byteStr = [[NSString alloc] initWithFormat:@"%.1f",allImageData/1024.0];
+        unitStr = @"MB";
+    }
+    else{
+        byteStr = [[NSString alloc] initWithFormat:@"%.2f",allImageData/1024.0/1024.0];
+        unitStr = @"G";
+    }
+    
+    
+    NSString *curStr1 = [NSString stringWithFormat:@"已选%ld项",_indexPathsForSelectedItems.count];
+    NSString *curStr2 = [NSString stringWithFormat:@"(%@%@,可用120.00GB)",byteStr,unitStr];
+    NSString *totalStr = [[NSString alloc] initWithFormat:@"%@ %@",curStr1,curStr2];
+    
+    NSMutableAttributedString *noteStr = [[NSMutableAttributedString alloc] initWithString:totalStr];
+    
+    NSRange redRange = NSMakeRange([totalStr rangeOfString:curStr2].location, [totalStr rangeOfString:curStr2].length);
+    [noteStr addAttribute:NSForegroundColorAttributeName value:[UIColor hwColor:@"#959799" alpha:1.0] range:redRange];
+    [noteStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:14.0] range:redRange];
+    // 设置行间距
+    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
+    [paragraphStyle setLineSpacing:5];        //设置行间距
+    
+    [noteStr addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [totalStr  length])];
+
+    _selectNumLabel.attributedText = noteStr;
+}
+
 #pragma mark 按钮点击
 - (void)didClickButFun:(UIButton*)but
 {

+ 1 - 1
创维盒子/双子星云手机/Class/Set/uploadFile/uploadImageOrVideoViewController.h

@@ -16,7 +16,7 @@ NS_ASSUME_NONNULL_BEGIN
 //选择过滤
 @property (nonatomic, strong) NSPredicate *selectionFilter;
 
-//选中的项
+//选中的项 TZAssetModel
 @property (nonatomic, strong) NSMutableArray *indexPathsForSelectedItems;
 
 @end

+ 45 - 88
创维盒子/双子星云手机/Class/Set/uploadFile/uploadImageOrVideoViewController.m

@@ -13,6 +13,7 @@
 #import "AJPhotoListCell.h"
 #import "uploadFileBottomView.h"
 #import "PhotoPreviewViewController.h"
+#import "TZAssetModel+imageData.h"
 
 @interface uploadImageOrVideoViewController ()<AJPhotoGroupViewProtocol,UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout>
 
@@ -302,7 +303,7 @@
 - (void)loadAssets:(TZAlbumModel *)model {
     [self.indexPathsForSelectedItems removeAllObjects];
     [self.assets removeAllObjects];
-    
+
     [[TZImageManager manager] getAssetsFromFetchResult:model.result completion:^(NSArray<TZAssetModel *> *models) {
         self->_assets = [NSMutableArray arrayWithArray:models];
         [self.photoListView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
@@ -349,103 +350,59 @@
 }
 
 - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
-//    AJPhotoListCell *cell = (AJPhotoListCell *)[self.photoListView cellForItemAtIndexPath:indexPath];
-//    ALAsset *asset = self.assets[indexPath.row];
-    
     PhotoPreviewViewController *vc =[PhotoPreviewViewController new];
     vc.assets = _assets;
     vc.currentIndex = indexPath.row;
+    vc.indexPathsForSelectedItems = _indexPathsForSelectedItems;
+    vc.maximumNumberOfSelection = _maximumNumberOfSelection;
+    vc.minimumNumberOfSelection = _minimumNumberOfSelection;
     [self.navigationController pushViewController:vc animated:YES];
+}
+
+#pragma mark 处理点击选中相关
+- (void)handlCellSelectFunBy:(NSIndexPath *)indexPath
+{
     
-    //相机按钮处理
-//    if ([asset isKindOfClass:[UIImage class]] && _delegate && [_delegate respondsToSelector:@selector(photoPickerTapCameraAction:)]) {
-//        [_delegate photoPickerTapCameraAction:self];
-//        return;
-//    }
-    
-    //单选
-//    if (!self.multipleSelection && self.indexPathsForSelectedItems.count==1) {
-//        //取消上一个选中
-//        NSInteger index = [self.assets indexOfObject:self.indexPathsForSelectedItems[0]];
-//        NSIndexPath *indexPath = [NSIndexPath indexPathForItem:index inSection:0];
-//        AJPhotoListCell *previousCell = (AJPhotoListCell *)[self.photoListView cellForItemAtIndexPath:indexPath];
-//        [previousCell isSelected:NO];
-//        [self.indexPathsForSelectedItems removeAllObjects];
-//
-//        //选中当前的
-//        [self.indexPathsForSelectedItems addObject:asset];
-//        [cell isSelected:YES];
-//        if (_delegate && [_delegate respondsToSelector:@selector(photoPicker:didDeselectAsset:)])
-//            [_delegate photoPicker:self didDeselectAsset:asset];
-//        return;
-//    }
+    AJPhotoListCell *cell = (AJPhotoListCell *)[self.photoListView cellForItemAtIndexPath:indexPath];
+    TZAssetModel *model = self.assets[indexPath.row];
     
     //超出最大限制
-//    if (self.indexPathsForSelectedItems.count >= self.maximumNumberOfSelection && ![self.indexPathsForSelectedItems containsObject:asset]) {
-//        if (_delegate && [_delegate respondsToSelector:@selector(photoPickerDidMaximum:)])
-//            [_delegate photoPickerDidMaximum:self];
-//        return;
-//    }
-//
-//    //选择过滤
-//    BOOL selectable = [self.selectionFilter evaluateWithObject:asset];
-//    if (!selectable) {
-//        if (_delegate && [_delegate respondsToSelector:@selector(photoPickerDidSelectionFilter:)])
-//            [_delegate photoPickerDidSelectionFilter:self];
-//        return;
-//    }
-//
-//    //取消选中
-//    if ([self.indexPathsForSelectedItems containsObject:asset]) {
-//        [self.indexPathsForSelectedItems removeObject:asset];
-//        [cell isSelected:NO];
-//        if (_delegate && [_delegate respondsToSelector:@selector(photoPicker:didDeselectAsset:)])
-//            [_delegate photoPicker:self didDeselectAsset:asset];
-//        return;
-//    }
-//
-//    //选中
-//    [self.indexPathsForSelectedItems addObject:asset];
-//    [cell isSelected:YES];
-//    if (_delegate && [_delegate respondsToSelector:@selector(photoPicker:didSelectAsset:)])
-//        [_delegate photoPicker:self didSelectAsset:asset];
+    if (self.indexPathsForSelectedItems.count >= self.maximumNumberOfSelection ) {
+        return;
+    }
+    
+    //取消选中
+    if ([self.indexPathsForSelectedItems containsObject:model]) {
+        [self.indexPathsForSelectedItems removeObject:model];
+        model.isSelected = NO;
+        [cell isSelected:NO];
+    }
+    else{//选中
+        [self.indexPathsForSelectedItems addObject:model];
+        model.isSelected = YES;
+        [cell isSelected:YES];
+        
+        if(!model.imageData)
+        {
+            [[PHImageManager defaultManager] requestImageDataForAsset:model.asset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
+                    // 直接得到最终的 NSData 数据
+                    if (imageData) {
+                        model.imageData = imageData;
+                    }
+                
+                [self setDataToBottomViewFun];
+            }];
+        }
+    }
+    
+    
+    [self setDataToBottomViewFun];
 }
 
-#pragma mark 处理点击选中相关
-- (void)handlCellSelectFunBy:(NSIndexPath *)indexPath
+#pragma mark 同步数据到底部
+- (void)setDataToBottomViewFun
 {
-//    AJPhotoListCell *cell = (AJPhotoListCell *)[self.photoListView cellForItemAtIndexPath:indexPath];
-//    ALAsset *asset = self.assets[indexPath.row];
-//    
-//    //超出最大限制
-//    if (self.indexPathsForSelectedItems.count >= self.maximumNumberOfSelection && ![self.indexPathsForSelectedItems containsObject:asset]) {
-//        if (_delegate && [_delegate respondsToSelector:@selector(photoPickerDidMaximum:)])
-//            [_delegate photoPickerDidMaximum:self];
-//        return;
-//    }
-//    
-//    //选择过滤
-//    BOOL selectable = [self.selectionFilter evaluateWithObject:asset];
-//    if (!selectable) {
-//        if (_delegate && [_delegate respondsToSelector:@selector(photoPickerDidSelectionFilter:)])
-//            [_delegate photoPickerDidSelectionFilter:self];
-//        return;
-//    }
-//    
-//    //取消选中
-//    if ([self.indexPathsForSelectedItems containsObject:asset]) {
-//        [self.indexPathsForSelectedItems removeObject:asset];
-//        [cell isSelected:NO];
-//        if (_delegate && [_delegate respondsToSelector:@selector(photoPicker:didDeselectAsset:)])
-//            [_delegate photoPicker:self didDeselectAsset:asset];
-//        return;
-//    }
-//    
-//    //选中
-//    [self.indexPathsForSelectedItems addObject:asset];
-//    [cell isSelected:YES];
-//    if (_delegate && [_delegate respondsToSelector:@selector(photoPicker:didSelectAsset:)])
-//        [_delegate photoPicker:self didSelectAsset:asset];
+    self.uploadFileBottomV.indexPathsForSelectedItems = self.indexPathsForSelectedItems;
 }
 
 #pragma mark - getter/setter