【代碼筆記】iOS-collectionView實現照片刪除

来源:http://www.cnblogs.com/yang-guang-girl/archive/2017/11/23/7883117.html
-Advertisement-
Play Games

一,效果圖。 二,工程圖。 三,代碼。 ViewController.h ViewController.m photoCollectionViewCell.h photoCollectionViewCell.m ...


一,效果圖。

二,工程圖。

三,代碼。

ViewController.h

複製代碼
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
<UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout,UIAlertViewDelegate,UIActionSheetDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate>
{
    UICollectionView *_collectionView;
    UIImagePickerController *_imagePicker;
    NSMutableArray *photos;
    NSMutableArray *dataArray;
    NSInteger deleteIndex;
    BOOL wobble;
}
@end
複製代碼

 

ViewController.m

複製代碼
//點擊添加按鈕的時候,停止刪除。
#import "ViewController.h"
#import "photoCollectionViewCell.h"

NSInteger const Photo = 8;

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    

    //其佈局很有意思,當你的cell設置大小後,一行多少個cell,由cell的寬度決定
    UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init];
    //設置cell的尺寸
    [flowLayout setItemSize:CGSizeMake(70, 70)];
    //設置其佈局方向
    [flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];
    //設置其邊界(上,左,下,右)
    flowLayout.sectionInset = UIEdgeInsetsMake(5,5,5,5);

    
    _collectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(10, 50, 320,85*2) collectionViewLayout:flowLayout];
    _collectionView.dataSource = self;
    _collectionView.delegate = self;
    _collectionView.backgroundColor = [UIColor redColor];
   [_collectionView registerClass:[photoCollectionViewCell class] forCellWithReuseIdentifier:@"photo"];
   [self.view addSubview:_collectionView];
    
    
    
    photos = [[NSMutableArray alloc ] init];
    
    dataArray = [[NSMutableArray alloc ] init];
    [dataArray addObject:[UIImage imageNamed:@"contract_addpic1"]];
    
}
//section
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}
//item個數
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return dataArray.count;
    
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"--indexPath.row--%ld",indexPath.row);
    NSLog(@"---indexpath.section--%ld",indexPath.section);
    photoCollectionViewCell *cell = (photoCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"photo" forIndexPath:indexPath];
    cell.tag=indexPath.row;
    
    
    //圖片
    cell.photoImage.image=dataArray[indexPath.row];
    
    
    // 刪除按鈕
    cell.deleteBtn.tag =indexPath.row;
    cell.deleteBtn.hidden=YES;
    [cell.deleteBtn addTarget:self action:@selector(doClickDeleteButton:) forControlEvents:UIControlEventTouchUpInside];
    
    
    //增加按鈕
    if (indexPath.row == dataArray.count -1) {
        cell.addBtn.hidden = NO;
    }else
    {
        cell.addBtn.hidden = YES;
    }
    [cell.addBtn addTarget:self action:@selector(doClickAddButton:) forControlEvents:UIControlEventTouchUpInside];
    
    
    
    // 長按刪除
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc ] initWithTarget:self action:@selector(longPressedAction)];
    [cell.contentView addGestureRecognizer:longPress];
    return cell;

}
#pragma -mark -doClickActions
//刪除按鈕
-(void)doClickDeleteButton:(UIButton *)btn
{
    NSLog(@"-----doClickDeleteButton-------");
    UIAlertView *alert = [[UIAlertView alloc ] initWithTitle:@"提示" message:@"您確定要刪除嗎?" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
    deleteIndex = btn.tag;
    [alert show];
    
    NSLog(@"---delete--dataArray---%@",dataArray);
}
//增加按鈕
-(void)doClickAddButton:(UIButton *)btn
{
    NSLog(@"-----doClickAddButton-------");
    if (wobble) {
        // 如果是編輯狀態則取消編輯狀態
        [self cancelWobble];
        
    }else{
        //不是編輯狀態,添加圖片
        if (dataArray.count > Photo) {
            UIAlertView *alert = [[UIAlertView alloc ] initWithTitle:@"提示" message:@"最多支持8個" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
            [alert show];
        }else
        {
            UIActionSheet *actionSheet = [[UIActionSheet alloc]
                                          initWithTitle:nil
                                          delegate:(id)self
                                          cancelButtonTitle:@"取消"
                                          destructiveButtonTitle:nil
                                          otherButtonTitles:@"拍照", @"我的相冊",nil];
            actionSheet.actionSheetStyle = UIActionSheetStyleBlackOpaque;
            [actionSheet showInView:self.view];
        }
    }
    
    NSLog(@"---add--dataArray---%@",dataArray);

}
//長按刪除
-(void)longPressedAction
{
    NSLog(@"-----longPressedAction-------");
    
    wobble = YES;
    NSArray *array =  [_collectionView subviews];
    
    for (int i = 0; i < array.count; i ++) {
         if ([array[i] isKindOfClass:[photoCollectionViewCell class]]) {
            photoCollectionViewCell *cell = array[i];
            if (cell.addBtn.hidden) {
                cell.deleteBtn.hidden = NO;
            }
            else
            {
                cell.deleteBtn.hidden = YES;
                cell.photoImage.image = [UIImage imageNamed:@"ensure"];
                cell.tag = 999999;
            }
            
            // 晃動動畫
            [self animationViewCell:cell];
        }
    }

}
// 取消晃動
-(void)cancelWobble
{
    wobble = NO;
    NSArray *array =  [_collectionView subviews];
    for (int i = 0; i < array.count; i ++) {
        if ([array[i] isKindOfClass:[photoCollectionViewCell class]]) {
            photoCollectionViewCell *cell = array[i];
            cell.deleteBtn.hidden =  YES;
            if (cell.tag == 999999) {
               cell.photoImage.image = [UIImage imageNamed:@"plus"];
            }
            // 晃動動畫
            [self animationViewCell:cell];
        }
    }
}
// 晃動動畫
-(void)animationViewCell:(photoCollectionViewCell *)cell
{
    //搖擺
    if (wobble){
        cell.transform = CGAffineTransformMakeRotation(-0.1);
        
        [UIView animateWithDuration:0.08
                              delay:0.0
                            options:UIViewAnimationOptionRepeat|UIViewAnimationOptionAutoreverse|UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionCurveLinear
                         animations:^{
                             cell.transform = CGAffineTransformMakeRotation(0.1);
                         } completion:nil];
    }
    else{
        
        [UIView animateWithDuration:0.25
                              delay:0.0
                            options:UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionBeginFromCurrentState|UIViewAnimationOptionCurveEaseOut
                         animations:^{
                             cell.transform = CGAffineTransformIdentity;
                         } completion:nil];
    }
}
#pragma -mark -UIActionSheetDelegate
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 0) {
        [self openCamera];
    }else if(buttonIndex == 1) {
        [self openPics];
    }
}


#pragma -mark -UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 1) {
        [dataArray removeObjectAtIndex:deleteIndex];
        NSIndexPath *path =  [NSIndexPath indexPathForRow:deleteIndex inSection:0];
        [_collectionView deleteItemsAtIndexPaths:@[path]];
        
        // 如果刪除完,則取消編輯
        if (dataArray.count == 1) {
            [self cancelWobble];
            
        }
        // 沒有刪除完,執行晃動動畫
        else
        {
            [self longPressedAction];
        }
    }
}
#pragma -mark -camera
// 打開相機
- (void)openCamera {
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
    {
        if (_imagePicker == nil) {
            _imagePicker =  [[UIImagePickerController alloc] init];
        }
        _imagePicker.delegate = (id)self;
        _imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
        _imagePicker.showsCameraControls = YES;
        _imagePicker.allowsEditing = YES;
        [self.navigationController presentViewController:_imagePicker animated:YES completion:nil];
    }
}

// 打開相冊
- (void)openPics {
    if (_imagePicker == nil) {
        _imagePicker = [[UIImagePickerController alloc] init];
    }
    _imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    _imagePicker.allowsEditing = YES;
    _imagePicker.delegate = (id)self;
    [self presentViewController:_imagePicker animated:YES completion:NULL];
}

// 選中照片
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
    
    [_imagePicker dismissViewControllerAnimated:YES completion:NULL];
    _imagePicker = nil;
    
    // 判斷獲取類型:圖片
    if ([mediaType isEqualToString:@"public.image"]){
        UIImage *theImage = nil;
        
        // 判斷,圖片是否允許修改
        if ([picker allowsEditing]){
            //獲取用戶編輯之後的圖像
            theImage = [info objectForKey:UIImagePickerControllerEditedImage];
        } else {
            // 照片的元數據參數
            theImage = [info objectForKey:UIImagePickerControllerOriginalImage] ;
            
        }
        [dataArray insertObject:theImage atIndex:0];
        
        NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:0];
        [_collectionView insertItemsAtIndexPaths:@[path]];
    }
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [picker dismissViewControllerAnimated:YES completion:NULL];
}
// 判斷設備是否有攝像頭
- (BOOL) isCameraAvailable{
    return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
}

#pragma mark - 相冊文件選取相關
// 相冊是否可用
- (BOOL) isPhotoLibraryAvailable{
    return [UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypePhotoLibrary];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
複製代碼

 

photoCollectionViewCell.h

複製代碼
#import <UIKit/UIKit.h>

@interface photoCollectionViewCell : UICollectionViewCell
@property (weak, nonatomic) IBOutlet UIButton *addBtn;
@property (weak, nonatomic) IBOutlet UIImageView *photoImage;
@property (weak, nonatomic) IBOutlet UIButton *deleteBtn;

@end
複製代碼

 

photoCollectionViewCell.m

複製代碼
#import "photoCollectionViewCell.h"

@implementation photoCollectionViewCell
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        // 初始化時載入collectionCell.xib文件
        NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"photoCollectionViewCell" owner:self options:nil];
        
        // 如果路徑不存在,return nil
        if (arrayOfViews.count < 1)
        {
            return nil;
        }
        // 如果xib中view不屬於UICollectionViewCell類,return nil
        if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]])
        {
            return nil;
        }
        // 載入nib
        self = [arrayOfViews objectAtIndex:0];
    }
    return self;
}

- (void)awakeFromNib {
    // Initialization code
}

@end
複製代碼
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 查看原文 ...
  • 為什麼要使用cdn 雅虎軍規有一條規則建議我們是用cdn。隨便在網上搜索,可以找到使用的cdn的好處。 再次強調第一條黃金定律,減少網頁內容的下載時間。提高下載速度還可以通過CDN(內容分髮網絡)來提升。CDN通過部署在不同地區的伺服器來提高客戶的下載速度。如果你的網站上有大量的靜態內容,世界各地的 ...
  • 1、JS中的||符號: 運算方法: 只要“||”前面為false,不管“||”後面是true還是false,都返回“||”後面的值。 只要“||”前面為true,不管“||”後面是true還是false,都返回“||”前面的值。 總結:真前假後 2、JS中的&&符號: 運算方法: 只要“&&”前面是 ...
  • 由於最近剛換了一個工作,所以決定重新申請一個blog,把工作當中遇到的一些問題記錄下來,方便自己下次忘記,也希望能與一起需要的小伙伴一起共勉。 如果有不同的觀點或者是不同的看法,大家都可以暢談,我一直認為討論、實踐才是提升自己能力的真正‘路徑’。。。(好啦,進入今天的主題) 在這份工作開始之前,我一 ...
  • 一、DOM API也在不斷升級 web前端標準一直在不斷升級,比方說,說了很多年的HTML5、CSS3,以及天天見的ES6。 然後,似乎就沒有然後了。實際上,除了HTML5/CSS3/ES6+,關於DOM標準也是在不斷升級進步,而且瀏覽器也在悄悄地進行跟進與支持。 然而,這種跟進與支持呢非常的低調與 ...
  • 一、text-decoration:underline下劃線的問題 CSS text-decoration:underline可以給內聯文本增加下劃線,但是,如果對細節要求較高,就會發現,下劃線經常會和中文文字的下邊緣搞在一起,英文的話甚至直接穿越,看起來就比較香菇藍瘦。 上圖幾個中文下邊緣正好都是 ...
  • 第3章 盒模型,定位,浮動,清理 1.盒模型用到的屬性width,height,padding,border,margin 普通文檔流的上下垂直margin會疊加 2.塊級框 與 行內框, 利用display屬性來改變特性,display:block,display:inlne-block 3. 3 ...
  • 第2章 選擇器,註釋 1.要知道常用選擇器(id選擇器,類選擇器,類型選擇器,後代選擇器,偽類選擇器(文檔結構之外)) 通用選擇器(*{ }) 高級選擇器(子選擇器,相鄰同胞選擇器,屬性選擇器) 2.選擇器特殊性分級 3.層疊和繼承的區別 4.設計代碼的結構,使用風格統一的大註釋塊分割每個部分 一般 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...