如何學習新框架(保存圖片到相冊)

来源:http://www.cnblogs.com/xiaotian666/archive/2016/08/12/5766244.html
-Advertisement-
Play Games

一.點擊查看大圖 1.點擊圖片或按鈕(點擊查看大圖按鈕),modal出來一個控制器,顯示大圖片 2.怎麼處理能讓點擊圖片就能查看大圖? 兩種方法:1.給圖片添加點按手勢 2.給圖片所在的view上添加 - (void)touchesEnded:(NSSet<UITouch *> *)touches ...


一.點擊查看大圖 1.點擊圖片或按鈕(點擊查看大圖按鈕),modal出來一個控制器,顯示大圖片   2.怎麼處理能讓點擊圖片就能查看大圖?      兩種方法:1.給圖片添加點按手勢                         2.給圖片所在的view上添加 - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event             2.1 添加點按手勢                優點:適用於任何場景下,不受限制                缺點:代碼量大                      2.2 給圖片所在view添加touchesEnded:方法                優點:能快速達到點擊查看大圖效果,代碼量小                缺點:只有當圖片所在view和圖片一樣大的時候,方法才好用,應用場景有限   3.怎麼快速拿到控制器,來modal?      能快速拿到的控制器,就是視窗的根控制器       4.創建一個控制器,點擊圖片的時候就把控制器modal出來      4.1 在控制器上添加一個scrollView,占據全屏           因為大圖片能夠上下滾動查看                 4.2 scrollView上面還要添加一個UIImageView           我們需要手動創建UIImageView,然後手動添加到scrollView上           因為圖片尺寸不固定,大圖占據全屏,小圖居中        4.3 在控制器上添加兩個按鈕           一個返回按鈕,一個保存圖片按鈕        4.4 所以,我們創建的控制器應該為UIViewController   5.在moadl出來的控制器顯示大圖片      5.1 要想在控制器中查看大圖,首先要拿到大圖,怎麼拿?           5.1.1可以創建一個通知,把圖片當做通知參數傳遞           5.1.2因為控制器是在圖片的uiview中modal出來的,可以用順傳的方法,把模型傳遞給控制器                順傳: 1.上一級拿到下一級的控制器   2.在下一級控制器中定義屬性接收數據    3.在上一級中給下一級定義的屬性賦值        5.2 在查看大圖控制器中用代碼創建一個UIImageView控制項,biang添加到scrollView上面            5.3 判斷是否是大圖           5.3.1 是大圖,就設置UIImageView的frame從0,0(坐標原點)開始顯示                     寬度等於屏幕寬度,高度就按照寬度的縮放比例進行縮放                      5.3.2 不是大圖,就設置UIImageView的中心為屏幕的中心    6.顯示大圖的時候,讓大圖能夠縮放      6.1如何縮放?             6.1.1 添加捏合手勢,使用transform對圖片縮放                優點:適用於任何場景                缺點:代碼比較複雜             6.1.2 使用scrollView的代理方法                優點:代碼相對來說,比較簡單                缺點:只有才能使用        6.2 怎麼用scrollView代理.進行縮放             6.2.1 遵守協議,實現代理方法           6.2.2 在代理方法裡面返回需要縮放的view           6.2.3 在外界設置最大(最小的縮放比例)   查看大圖併進行縮放源代碼
 1 - (void)viewDidLoad {
 2     [super viewDidLoad];
 3    
 4     UIImage *image = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:_item.image0];
 5    
 6     UIImageView *imageView = [[UIImageView alloc] init];
 7     _imageView = imageView;
 8     [imageView sd_setImageWithURL:[NSURL URLWithString:_item.image1] placeholderImage:image];
 9     CGFloat h = XMGScreenW / _item.width * _item.height;
10     imageView.frame = CGRectMake(0, 0, XMGScreenW, h);
11     [_scroolView addSubview:imageView];
12    
13     if (_item.is_bigPicture) {
14         _scroolView.contentSize = CGSizeMake(0, h);
15        
16         if (_item.height > h) {
17             CGFloat scale = _item.height / h;
18           //2.設置縮放比例
19             _scroolView.maximumZoomScale = scale;
20             _scroolView.minimumZoomScale = 1; 
21         }
22     } else {
23         imageView.center = CGPointMake(XMGScreenW * 0.5, XMGScreenH * 0.5);
24     }
25     // 縮放
26         //1.設置代理,告訴它哪個View需要做縮放
27         //2.設置縮放比例
28     _scroolView.delegate = self;
29 }
30 #pragma mark - UIScrollViewDelegate
31 // 作用:返回需要做縮放的view
32 // 調用:每次縮放的時候才會調用
33 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
34 {
35     return _imageView;
36 }

 

  二.保存圖片到相冊 1.保存圖片到相冊也有兩種方法      1.1 調用系統方法保存到相冊           優點:簡單快捷,兩個方法就能實現           缺點:只能保存到系統相冊下,不能保存到自定義的相冊下           註意:監聽圖片是否保存完成的方法,必須是系統指定的方法,可以跳進保存圖片到相冊的方法裡面查看該方法            1.2 用 Photos框架,自定義相冊保存圖片           優點:能把圖片保存到指定的相冊           缺點:diamante量大,需要學習新的框架   保存到系統相冊源代碼
 1 // 點擊保存調用
 2 - (IBAction)save:(id)sender {
 3     // 保存系統相冊
 4     UIImageWriteToSavedPhotosAlbum(_imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
 5 }
 6 // 詢問下用戶是否允許當前app訪問相冊
 7 // 監聽圖片是否保存完成
 8 - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
 9 {
10     if (error) {
11         [SVProgressHUD showErrorWithStatus:@"保存失敗"];
12     } else {
13         [SVProgressHUD showSuccessWithStatus:@"保存成功"];
14     }
15 }

 

  2.如何學習一個新的框架      2.1 首先搞清楚這個框架常用的類            2.2 怎麼搞清楚,哪些類常用?           2.2.1 百度(天朝的度娘太複雜,多變)           2.2.2 查看官方文檔        2.3 怎麼能快速定位相關框架的官方文檔?                搜索關鍵字:   框架名稱 + FrameWork Reference      

 

 

         2.4 如何學習去使用一個類(方法)?           按住 option 點擊類名 或方法名            總結:1.如果想瞭解類,有哪些東西,跳頭文件 2.如果想瞭解怎麼使用,用option                

 

    3.用 Photos框架,自定義相冊保存圖片      3.1 保存圖片到相冊原理           3.1.1 創建新的相冊           3.1.2 先把圖片保存到系統相冊           3.1.3 把圖片從系統相冊拷貝到新的相冊   Photos常用5個類,操作相冊
    擁有的時候
    PHPhotoLibrary:相簿:(所有相冊集合)
    PHAssetCollection:相冊(圖片集合)
    PHAsset:圖片
 
    創建的時候:
    PHAssetCreationRequest:創建新圖片,刪除圖片,修改圖片     PHAssetCollectionChangeRequest:創建相冊,刪除相冊,修改相冊        3.2 如何保存圖片到自己的相冊?           使用 Photos框架            3.3 Photos框架保存圖片到自己相冊步驟           3.3.1 創建圖片請求類(給系統相冊創建一張新的圖片)           3.3.2 創建相冊請求類(修改相冊)           3.3.3 把圖片拷貝到自己相冊中           3.3.4 步驟在類的介紹中有示例           3.3.5 註意:創建圖片和相冊請求類必須包裝在一個方法裡面,這個方法在頭文件裡面能查看到,這個方法又分為同步和非同步兩種,一般用非同步的                 3.4 怎麼拷貝到自己的相冊?           3.4.1用相冊請求類對象 調用 [assetCollectionChangeRequest addAssets:<#(nonnull id<NSFastEnumeration>)#>] 方法           3.4.2(nonnull id<NSFastEnumeration>)參數是什麼意思?                表示可以傳一個對象,但要遵守 NSFastEnumeration 協議                遵守這個協議的一般是數組,因為 Enumeration 是遍歷的意思,一般數組才能遍歷           3.4.3 不知道參數怎麼寫,怎麼辦?                按住option 點擊方法,查看方法介紹,裡面有介紹參數怎麼寫           3.4.4 以後只要看到這個NSFastEnumeration協議,就可以表示數組   4.功能做好後我們還發現兩個問題      4.1 保存前要查看app是否有許可權訪問相冊(如果沒授權,就詢問用戶是否允許訪問)      4.2 每次保存都會創建新的相冊          5.許可權問題解決方案      5.1每次保存前都先查看app許可權,如果允許訪問,直接保存      5.2不允許訪問,就提示用戶,去設置裡面設置許可權      5.3如果沒有授權,就彈出許可權框,讓用戶授權   許可權的四種狀態:   (第一次)PHAuthorizationStatusNotDetermined = 0, 不確定是否允許當前app訪問系統相冊
     PHAuthorizationStatusRestricted, 家長控制
     PHAuthorizationStatusDenied, (拒絕)不允許當前app訪問系統相冊      PHAuthorizationStatusAuthorized (授權)允許當前app訪問系統相冊   6.每次都創建新的相冊解決方案      6.1 保存之前,先查看系統相簿是否存在同名的相冊      6.2 如果存在,就保存到這個相冊中      6.3 不存在,就創建相冊保存   7. 怎麼確定是否存在相冊?      7.1思考:用一個屬性來決定相冊是否存在可以嗎? 不可以,下次啟動屬性就為空了      7.2 把屬性存到沙盒可以嗎?   不可以,如果把app卸載,又重新安裝,沙盒也為空,但相冊存在      7.3 最終方案:獲取所有相冊,查看是否存在同名相冊   8.怎麼獲取所有相冊?      8.1 先查看相簿類 是否有這樣的方法  找關鍵字PHAssetCollection相冊 發現沒有      8.2 去查看相冊類 是否有這樣的方法 可能是相冊自己管理自己  找到一個方法            + (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithType:(PHAssetCollectionType)type subtype:(PHAssetCollectionSubtype)subtype options:(nullable PHFetchOptions *)options; fetch查找的意思                   8.3 PHFetchResult這個返回值類型不知道是什麼,怎麼辦?           點進去看一下,發現                    8.4 參數不會傳,可以用option 或者先傳空,如果有問題,在回來解決參數問題,如果是枚舉參數,一般先傳預設值   保存到圖片到自定義相冊源代碼
 1 // 點擊保存調用
 2 - (IBAction)save:(id)sender {
 3    //查看當前app授權狀態
 4     PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
 5     switch (status) {
 6         case PHAuthorizationStatusNotDetermined:
 7         { // 未授權,彈出授權框
 8             [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
 9                // 用戶選擇完畢就會調用—選擇允許,直接保存
10                 if (status == PHAuthorizationStatusAuthorized) {
11                     [self savePhoto];
12                 }
13             }];
14            選擇不允許訪問,就不保存
15             break;
16         }
17         case PHAuthorizationStatusAuthorized:
18         { // 授權,就直接保存
19             [self savePhoto];
20             break;
21         }
22         default:
23         {// 拒絕   告知用戶去哪打開授權
24             [SVProgressHUD showInfoWithStatus:@"打開設置 -> 查找百思不得姐 -> 打開照片開關 -> 允許當前app訪問系統相冊就可以保存圖片"];
25             break;
26         }
27     }
28 }
29 
30 // 添加圖片到自己相冊
31 - (void)savePhoto
32 {
33     [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
34         // 1.創建圖片請求類(創建系統相冊中新的圖片)PHAssetCreationRequest
35         // 把圖片放在系統相冊
36         PHAssetCreationRequest *assetCreationRequest = [PHAssetCreationRequest creationRequestForAssetFromImage:_imageView.image];
37        
38         // 2.創建相冊請求類(修改相冊)PHAssetCollectionChangeRequest
39         PHAssetCollectionChangeRequest *assetCollectionChangeRequest = nil;
40        
41         // 獲取之前相冊
42         PHAssetCollection *assetCollection = [self fetchAssetCollection:@"百思不得姐"];
43        
44         // 判斷是否已有相冊
45         if (assetCollection) {
46             // 如果存在已有同名相冊   指定這個相冊,創建相冊請求修改類  
47             assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
48         } else {  //不存在,創建新的相冊
49             assetCollectionChangeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:@"百思不得姐"];
50         } 
51         // 3.把圖片添加到相冊中
52         // NSFastEnumeration:以後只要看到這個,就可以表示數組
53         //assetCreationRequest.placeholderForCreatedAsset 圖片請求類占位符(相當於一個記憶體地址) 
54          //因為creationRequestForAssetFromImage方法是非同步實行的,在這裡不能保證 assetCreationRequest有值
55  
56         [assetCollectionChangeRequest addAssets:@[assetCreationRequest.placeholderForCreatedAsset]];
57  
58     } completionHandler:^(BOOL success, NSError * _Nullable error) {
59        
60         if (success) {
61             [SVProgressHUD showSuccessWithStatus:@"保存成功"];
62         } else {
63             [SVProgressHUD showErrorWithStatus:@"保存失敗"];
64         }
65        
66     }];
67 }
68 
69 // 指定相冊名稱,獲取相冊
70 - (PHAssetCollection *)fetchAssetCollection:(NSString *)title
71 {
72     // 獲取相簿中所有自定義相冊
73     PHFetchResult *result = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
74     遍歷相冊,判斷是否存在同名的相冊
75     for (PHAssetCollection *assetCollection in result) {
76         if ([title isEqualToString:assetCollection.localizedTitle]) {  存在,就返回這個相冊
77             return assetCollection;
78         }
79     }  
80     return nil;
81 }

 

     
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 實現功能: 1、APP主界面底部模塊欄 2、ViewPager一屏多個界面顯示 3、........ 首先需要瞭解一下這個屬性的意思 ,即 是否允許子View超出父View的返回,有兩個值true 、false ,預設true 使用的時候給子View和根節點View控制項都設置android:clip ...
  • 先上圖 點擊+號就去選擇圖片 實際上這個添加本身就是一個ListView或者 RecyclerView 只是佈局有些特殊 item 在Adpater中判斷一個數據是不是為0和是不是最後一個添加的圖片就可以了。 這裡用到了一個正方形的,容器 這裡沒有寫圖片選擇器有興趣可以看這裡 圖片選擇器: http ...
  • 打開相機 打開相冊 onActivityResult OtherUtils ...
  • 一.界面搭建 1.確定開發模式 如果界面是固定的,可以用xib 界面的一些內容不固定,就用純代碼 cell用什麼方式去開發(我們採用純代碼和xib結合的方式) 2.劃分層次結構 2.1 怎麼劃分? 按照功能劃分 1.確定開發模式 如果界面是固定的,可以用xib 界面的一些內容不固定,就用純代碼 ce ...
  • Xcode7.2,iOS9.2環境下 嘗試在CollectionViewCell內部,添加LongPress手勢,顯示UIMenuController。 實現以上代碼,就可以在長按cell時顯示出UIMenuController。 註意註意:!!!!!要實現UIMenuItem的綁定方法, 很奇怪的 ...
  • 1:運行React Native報連接錯誤解決 解決方式: 在終端進入項目文件里,然後執行:(cd Pods/React; npm run start) 2:組件生命周期介紹 創建階段 1、 getDefaultProps 作用於組件類,也就是調用React.createClass()的時候被調用。 ...
  • 1.監聽按鈕點擊 2.判斷是否是點擊的同一個按鈕(記錄上次點擊的按鈕) 3.當重覆點擊相同按鈕時,需要獲取當前按鈕對應控制器刷新界面 3.1 判斷是否重覆點擊按鈕,代碼寫在哪裡? 點擊標題按鈕,屬於精華控制器的事情,所以找到精華控制器.寫在點擊按鈕方法裡面 3.2怎麼拿到按鈕對應的控制器? 通過當前 ...
  • 一、簡介 相信大家用eclipse上的模擬器會覺得很慢很卡,這裡給大家介紹個好東西安卓模擬器genymotion。瞭解更多,可到此網站https://www.genymotion.com/。 二、安裝genymotion 1、註冊genymotion登錄帳號 進入網站https://www.geny ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...