iOS 는 최근 사진 을 촬영 한 기능 인 스 턴 스 코드 를 위 챗/QQ 로 표시 합 니 다.

만약 당신 이 방금 사진 을 찍 었 다 면,위 챗/QQ 를 사용 하여 메시지 가 발생 했 을 때"당신 이 보 낼 그림"이 표 시 됩 니 다.

실현 원리:
1.채 팅 창 을 열거 나 다시 들 어 갈 때 갤러리 의 최신 사진 을 조회 하고 사진 찍 는 시간 과 현재 시간의 차 이 를 비교 하 며 한도 값(예 를 들 어 1 분)보다 낮 으 면 나타 납 니 다.PS:한도 값 은 논리 적 으로 최근 여 부 를 판단 하 는 근거 입 니 다.장점:최근 에 찍 은 사진 을 항상 찾 을 수 있다.단점:매번 그림 데 이 터 를 조회 해 야 하기 때문에 응답 이 느리다.
2.이미지 라 이브 러 리 변화 감청(관찰자 모드)을 등록 하고 이미지 라 이브 러 리 의 삭제 와 수정 사건 에 응답 하여 변화 이미지 데 이 터 를 얻 은 후에 대응 하 는 논 리 를 한다.장점:실시 간 응답;단점:성능 에 영향 을 미 쳐 감청 등록 전 변 화 된 데 이 터 를 얻 지 못 한다.
구현 방식:
1.info.plist 파일 에 카메라 데이터 에 접근 할 수 있 는 권한 을 추가 합 니 다.

2.응용 프로그램 을 시작 한 후에 카메라 권한 을 가 져 오 려 면 PHPhotoLibrary.requestAuthoriztion 방법 을 호출 합 니 다.알림 내용 은 plist 가 카메라 권한 필드 내용(PS:Android 의 동적 권한 획득 과 같은 방법)입 니 다.
3.카메라 권한 을 가 져 온 후 모든 PHAsset 형식의 사진 기록 을 캐 시 합 니 다(그림 바 이 너 리 데 이 터 는 포함 되 지 않 으 며 메모리 가 넘 칠 염려 가 없습니다).캐 시 모든 그림 기록 은 후속 적 인 비교 변 화 를 위해 사용 되 며 논리 적 으로 변화 전 데이터 입 니 다.
4.관찰자 모드 의 register,적당 한 곳 에서 unregisterChangeObserver 를 실행 해 야 합 니 다.
5.리 셋 함수 photoLibrary DidChange 에서 갤러리 변화 후의 논 리 를 합 니 다.이 PHChange 류 는 앞의 캐 시 변화 전 데이터 와 비교 하여 변 화 된 부분(추가,삭제,수정 포함)을 얻 을 수 있 습 니 다.대단 합 니 다.Android 에는 이렇게 편리 한 API 가 없습니다...)
6.DispatchQueue.main.async 를 사용 하면 메 인 스 레 드 가 비동기 적 으로 실 행 됩 니 다.Android 메 인 스 레 드 Handler 의 sendmessage 와 같은 역할 을 합 니 다.이것 은 관찰자 모드 의 표준 방법 으로 알림 대기 열 을 막 지 않도록 한다.
7.PHCaching ImageManager 를 사용 하여 PHAsset 의 이미지 데이터 ImageView 대상 을 추출 합 니 다.
8.UI 에 표 시 됩 니 다.
참조 코드:

import UIKit 
import Photos //               
//              
class ViewController: UIViewController, PHPhotoLibraryChangeObserver { 
 var assetsFetchResults:PHFetchResult<PHAsset>! 
 var imageManager: PHCachingImageManager! //           
 var imageView: UIImageView! //        
 var assetGridThumbnailSize: CGSize! //      
 override func viewDidLoad() { 
  super.viewDidLoad() 
  // Do any additional setup after loading the view, typically from a nib. 
  imageView = UIImageView() 
  imageView.frame = CGRect(x: 50, y: 50, width: 100, height: 100) 
  imageView.contentMode = .scaleAspectFit 
  imageView.clipsToBounds = true 
  self.view.addSubview(imageView) 
  self.imageManager = PHCachingImageManager() //         
  let scale = UIScreen.main.scale //    
  assetGridThumbnailSize = CGSize(width: imageView.frame.width*scale, 
          height: imageView.frame.height*scale) 
  //     
  PHPhotoLibrary.requestAuthorization({ (status) in 
   if status != .authorized { 
    return 
   } 
   //        (        ) 
   let allPhotoOptions = PHFetchOptions() 
   allPhotoOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", 
                ascending: false)] //     
   allPhotoOptions.predicate = NSPredicate(format: "mediaType = %d", 
             PHAssetMediaType.image.rawValue) //   
   self.assetsFetchResults = PHAsset.fetchAssets(with: .image, 
               options: allPhotoOptions) //       
   var i = 0 
   while i<self.assetsFetchResults.count { 
    let asset = self.assetsFetchResults[i] 
    print("     :\(asset.creationDate?.description)") //            
    i += 1 
   } 
   if (self.assetsFetchResults.count > 0) { 
    //           (                  ) 
    self.imageManager.requestImage(for: self.assetsFetchResults[0],  //       
            targetSize: self.assetGridThumbnailSize, 
            contentMode: .aspectFill, 
            options: nil, resultHandler: { (image, info) in 
            self.imageView.image = image //          
    }) 
   } 
   print("    :\(self.assetsFetchResults?.count)") 
   //         
   PHPhotoLibrary.shared().register(self) //   unregisterChangeObserver 
  }) 
 } 
 override func didReceiveMemoryWarning() { 
  super.didReceiveMemoryWarning() 
  // Dispose of any resources that can be recreated. 
 } 
 func photoLibraryDidChange(_ changeInstance: PHChange) { 
  guard let changes = changeInstance.changeDetails(for: self.assetsFetchResults as! PHFetchResult<PHObject>) else { 
   return 
  } 
  //    ,             
  DispatchQueue.main.async { 
   if let result = changes.fetchResultAfterChanges as? PHFetchResult<PHAsset> { 
    self.assetsFetchResults = result //     
   } 
   //                  
   if !changes.hasIncrementalChanges || changes.hasMoves { 
    return 
   } else { 
    print("       ") 
    if let indexs = changes.changedIndexes, indexs.count>0 { //   0    
     print(" \(indexs.count)       ") 
    } 
    if let removes = changes.removedIndexes, removes.count>0 { 
     print("   \(removes.count)   ") 
    } 
    if let inserts = changes.insertedIndexes, inserts.count>0 { 
     //      
     print("   \(inserts.count)   ") 
     let picture = self.assetsFetchResults[inserts.first!] 
     self.imageManager.requestImage(for: picture, 
             targetSize: self.assetGridThumbnailSize, 
             contentMode: .aspectFill, 
             options: nil, resultHandler: { (image, option) in 
             self.imageView.image = image //          
     }) 
    } 
   } 
  } 
 } 
} 
위 에서 말 한 것 은 소 편 이 소개 한 iOS 가 위 챗/QQ 를 실현 하여 최근 사진 을 촬영 한 기능 인 스 턴 스 코드 를 표시 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기