iOS 는 최근 사진 을 촬영 한 기능 인 스 턴 스 코드 를 위 챗/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 를 실현 하여 최근 사진 을 촬영 한 기능 인 스 턴 스 코드 를 표시 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.