diff --git a/Classes/ELCImagePicker/ELCAlbumPickerController.m b/Classes/ELCImagePicker/ELCAlbumPickerController.m index e375a0a..c99b63a 100755 --- a/Classes/ELCImagePicker/ELCAlbumPickerController.m +++ b/Classes/ELCImagePicker/ELCAlbumPickerController.m @@ -9,10 +9,10 @@ #import "ELCImagePickerController.h" #import "ELCAssetTablePicker.h" #import +#import +#import "UIAlertController+Extensions.h" -@interface ELCAlbumPickerController () - -@property (nonatomic, strong) ALAssetsLibrary *library; +@interface ELCAlbumPickerController () @end @@ -36,71 +36,83 @@ - (void)viewDidLoad NSMutableArray *tempArray = [[NSMutableArray alloc] init]; self.assetGroups = tempArray; - ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init]; - self.library = assetLibrary; - - // Load Albums into assetGroups - dispatch_async(dispatch_get_main_queue(), ^ - { - @autoreleasepool { - - // Group enumerator Block - void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) - { - if (group == nil) { - return; - } - - // added fix for camera albums order - NSString *sGroupPropertyName = (NSString *)[group valueForProperty:ALAssetsGroupPropertyName]; - NSUInteger nType = [[group valueForProperty:ALAssetsGroupPropertyType] intValue]; - - if ([[sGroupPropertyName lowercaseString] isEqualToString:@"camera roll"] && nType == ALAssetsGroupSavedPhotos) { - [self.assetGroups insertObject:group atIndex:0]; - } - else { - [self.assetGroups addObject:group]; - } - - // Reload albums - [self performSelectorOnMainThread:@selector(reloadTableView) withObject:nil waitUntilDone:YES]; - }; - - // Group Enumerator Failure Block - void (^assetGroupEnumberatorFailure)(NSError *) = ^(NSError *error) { - - if ([ALAssetsLibrary authorizationStatus] == ALAuthorizationStatusDenied) { - NSString *errorMessage = NSLocalizedString(@"This app does not have access to your photos or videos. You can enable access in Privacy Settings.", nil); - [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Access Denied", nil) message:errorMessage delegate:nil cancelButtonTitle:NSLocalizedString(@"Ok", nil) otherButtonTitles:nil] show]; - - } else { - NSString *errorMessage = [NSString stringWithFormat:@"Album Error: %@ - %@", [error localizedDescription], [error localizedRecoverySuggestion]]; - [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", nil) message:errorMessage delegate:nil cancelButtonTitle:NSLocalizedString(@"Ok", nil) otherButtonTitles:nil] show]; - } - - [self.navigationItem setTitle:nil]; - NSLog(@"A problem occured %@", [error description]); - }; - - // Enumerate Albums - [self.library enumerateGroupsWithTypes:ALAssetsGroupAll - usingBlock:assetGroupEnumerator - failureBlock:assetGroupEnumberatorFailure]; - + [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { + if (status == PHAuthorizationStatusAuthorized) { + [self loadAlbums]; + } else { + dispatch_async(dispatch_get_main_queue(), ^{ + NSString *errorMessage = NSLocalizedString(@"This app does not have access to your photos or videos. You can enable access in Privacy Settings.", nil); + [UIAlertController showAlertWithTitle:NSLocalizedString(@"Access Denied", nil) + message:errorMessage + cancelButton:NSLocalizedString(@"Ok", nil) + fromController:self]; + [self.navigationItem setTitle:nil];[self.navigationItem setTitle:nil]; + }); } - }); + }]; } - (void)viewWillAppear:(BOOL)animated { - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadTableView) name:ALAssetsLibraryChangedNotification object:nil]; + [super viewWillAppear:animated]; + [PHPhotoLibrary.sharedPhotoLibrary registerChangeObserver:self]; [self.tableView reloadData]; } - (void)viewWillDisappear:(BOOL)animated { - - [[NSNotificationCenter defaultCenter] removeObserver:self name:ALAssetsLibraryChangedNotification object:nil]; + [super viewWillDisappear:animated]; + [PHPhotoLibrary.sharedPhotoLibrary unregisterChangeObserver:self]; +} + +- (void)photoLibraryDidChange:(PHChange *)changeInstance { + [self reloadTableView]; +} + +- (void)loadAlbums { + dispatch_async(dispatch_get_main_queue(), ^{ + @autoreleasepool { + NSNumber *filter = [self assetFilter]; + PHFetchOptions *assetsFilter = [[PHFetchOptions alloc] init]; + assetsFilter.predicate = [ELCAsset slowmoFilterPredicate]; + if (filter) { + NSCompoundPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[assetsFilter.predicate, [ELCAsset assetFilterPredicate:filter.integerValue]]]; + assetsFilter.predicate = predicate; + } + NSArray *collectionsFetchResults; + + PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum + subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; + PHFetchResult *syncedAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum + subtype:PHAssetCollectionSubtypeAlbumSyncedAlbum options:nil]; + PHFetchResult *userCollections = [PHCollectionList fetchTopLevelUserCollectionsWithOptions:nil]; + + // Add each PHFetchResult to the array + collectionsFetchResults = @[smartAlbums, userCollections, syncedAlbums]; + + for (int i = 0; i < collectionsFetchResults.count; i ++) { + + PHFetchResult *fetchResult = collectionsFetchResults[i]; + + for (int x = 0; x < fetchResult.count; x ++) { + + PHAssetCollection *collection = fetchResult[x]; + PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsInAssetCollection:collection options:assetsFilter]; + if (assetsFetchResult.count > 0) { + NSString *sGroupPropertyName = collection.localizedTitle; + + if ([[sGroupPropertyName lowercaseString] isEqualToString:@"camera roll"] ) { + [self.assetGroups insertObject:collection atIndex:0]; + } + else { + [self.assetGroups addObject:collection]; + } + } + + } + } + [self performSelectorOnMainThread:@selector(reloadTableView) withObject:nil waitUntilDone:YES]; + } + }); } - (void)reloadTableView @@ -124,19 +136,19 @@ - (void)selectedAssets:(NSArray*)assets [_parent selectedAssets:assets]; } -- (ALAssetsFilter *)assetFilter +- (NSNumber *)assetFilter { if([self.mediaTypes containsObject:(NSString *)kUTTypeImage] && [self.mediaTypes containsObject:(NSString *)kUTTypeMovie]) { - return [ALAssetsFilter allAssets]; + return nil; } else if([self.mediaTypes containsObject:(NSString *)kUTTypeMovie]) { - return [ALAssetsFilter allVideos]; + return @(PHAssetMediaTypeVideo); } else { - return [ALAssetsFilter allPhotos]; + return @(PHAssetMediaTypeImage); } } @@ -167,17 +179,30 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } + NSNumber *filter = [self assetFilter]; + PHFetchOptions *assetsFilter = [[PHFetchOptions alloc] init]; + assetsFilter.predicate = [ELCAsset slowmoFilterPredicate]; + if (filter) { + NSCompoundPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[assetsFilter.predicate, [ELCAsset assetFilterPredicate:filter.integerValue]]]; + assetsFilter.predicate = predicate; + } + // Get count - ALAssetsGroup *g = (ALAssetsGroup*)[self.assetGroups objectAtIndex:indexPath.row]; - [g setAssetsFilter:[self assetFilter]]; - NSInteger gCount = [g numberOfAssets]; + PHAssetCollection *g = (PHAssetCollection*)[self.assetGroups objectAtIndex:indexPath.row]; + PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsInAssetCollection:g options:assetsFilter]; + NSInteger gCount = assetsFetchResult.count; + + PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; + options.resizeMode = PHImageRequestOptionsResizeModeExact; + [[PHImageManager defaultManager] requestImageForAsset:assetsFetchResult.firstObject targetSize:CGSizeMake(156,156) contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) { + cell.imageView.contentMode = UIViewContentModeScaleAspectFill; + cell.imageView.clipsToBounds = YES; + [cell.imageView setImage:result]; + }]; + + cell.textLabel.text = [NSString stringWithFormat:@"%@ (%ld)",g.localizedTitle, (long)gCount]; + [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; - cell.textLabel.text = [NSString stringWithFormat:@"%@ (%ld)",[g valueForProperty:ALAssetsGroupPropertyName], (long)gCount]; - UIImage* image = [UIImage imageWithCGImage:[g posterImage]]; - image = [self resize:image to:CGSizeMake(78, 78)]; - [cell.imageView setImage:image]; - [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; - return cell; } @@ -202,7 +227,7 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath picker.parent = self; picker.assetGroup = [self.assetGroups objectAtIndex:indexPath.row]; - [picker.assetGroup setAssetsFilter:[self assetFilter]]; + [picker setAssetsFilter:[self assetFilter]]; picker.assetPickerFilterDelegate = self.assetPickerFilterDelegate; diff --git a/Classes/ELCImagePicker/ELCAsset.h b/Classes/ELCImagePicker/ELCAsset.h index b812d77..a94bb1e 100755 --- a/Classes/ELCImagePicker/ELCAsset.h +++ b/Classes/ELCImagePicker/ELCAsset.h @@ -6,7 +6,7 @@ // #import -#import +#import @class ELCAsset; @@ -22,11 +22,14 @@ @interface ELCAsset : NSObject -@property (nonatomic, strong) ALAsset *asset; +@property (nonatomic, strong) PHAsset *asset; @property (nonatomic, weak) id parent; @property (nonatomic, assign) BOOL selected; -@property (nonatomic,assign) int index; +@property (nonatomic,assign) NSUInteger index; -- (id)initWithAsset:(ALAsset *)asset; +- (id)initWithAsset:(PHAsset *)asset; - (NSComparisonResult)compareWithIndex:(ELCAsset *)_ass; -@end \ No newline at end of file + ++ (NSPredicate*)assetFilterPredicate:(NSInteger)filter; ++ (NSPredicate*)slowmoFilterPredicate; +@end diff --git a/Classes/ELCImagePicker/ELCAsset.m b/Classes/ELCImagePicker/ELCAsset.m index a664192..eded34f 100755 --- a/Classes/ELCImagePicker/ELCAsset.m +++ b/Classes/ELCImagePicker/ELCAsset.m @@ -13,10 +13,10 @@ @implementation ELCAsset //Using auto synthesizers - (NSString *)description { - return [NSString stringWithFormat:@"ELCAsset index:%d",self.index]; + return [NSString stringWithFormat:@"ELCAsset index:%lu",(unsigned long)self.index]; } -- (id)initWithAsset:(ALAsset*)asset +- (id)initWithAsset:(PHAsset*)asset { self = [super init]; if (self) { @@ -70,5 +70,13 @@ - (NSComparisonResult)compareWithIndex:(ELCAsset *)_ass return NSOrderedSame; } ++ (NSPredicate*)assetFilterPredicate:(NSInteger)filter { + return [NSPredicate predicateWithFormat:@"mediaType = %d", filter]; +} + ++ (NSPredicate*)slowmoFilterPredicate { + return [NSPredicate predicateWithFormat:@"!((mediaSubtype & %d) == %d)", PHAssetMediaSubtypeVideoHighFrameRate, PHAssetMediaSubtypeVideoHighFrameRate]; +} + @end diff --git a/Classes/ELCImagePicker/ELCAssetCell.m b/Classes/ELCImagePicker/ELCAssetCell.m index d456b11..5483d1f 100755 --- a/Classes/ELCImagePicker/ELCAssetCell.m +++ b/Classes/ELCImagePicker/ELCAssetCell.m @@ -9,6 +9,7 @@ #import "ELCAsset.h" #import "ELCConsole.h" #import "ELCOverlayImageView.h" +#import @interface ELCAssetCell () @@ -49,6 +50,8 @@ - (void)setAssets:(NSArray *)assets for (ELCOverlayImageView *view in _overlayViewArray) { [view removeFromSuperview]; } + PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; + options.resizeMode = PHImageRequestOptionsResizeModeExact; //set up a pointer here so we don't keep calling [UIImage imageNamed:] if creating overlays UIImage *overlayImage = nil; for (int i = 0; i < [_rowAssets count]; ++i) { @@ -57,16 +60,21 @@ - (void)setAssets:(NSArray *)assets if (i < [_imageViewArray count]) { UIImageView *imageView = [_imageViewArray objectAtIndex:i]; - imageView.image = [UIImage imageWithCGImage:asset.asset.thumbnail]; + [[PHImageManager defaultManager] requestImageForAsset:asset.asset targetSize:CGSizeMake(156,156) contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) { + imageView.image = result; + }]; } else { - UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithCGImage:asset.asset.thumbnail]]; + UIImageView *imageView = [[UIImageView alloc] init]; + [[PHImageManager defaultManager] requestImageForAsset:asset.asset targetSize:CGSizeMake(156,156) contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) { + imageView.image = result; + }]; [_imageViewArray addObject:imageView]; } if (i < [_overlayViewArray count]) { ELCOverlayImageView *overlayView = [_overlayViewArray objectAtIndex:i]; overlayView.hidden = asset.selected ? NO : YES; - overlayView.labIndex.text = [NSString stringWithFormat:@"%d", asset.index + 1]; + overlayView.labIndex.text = [NSString stringWithFormat:@"%lu", asset.index + 1]; } else { if (overlayImage == nil) { overlayImage = [UIImage imageNamed:@"Overlay.png"]; @@ -74,7 +82,7 @@ - (void)setAssets:(NSArray *)assets ELCOverlayImageView *overlayView = [[ELCOverlayImageView alloc] initWithImage:overlayImage]; [_overlayViewArray addObject:overlayView]; overlayView.hidden = asset.selected ? NO : YES; - overlayView.labIndex.text = [NSString stringWithFormat:@"%d", asset.index + 1]; + overlayView.labIndex.text = [NSString stringWithFormat:@"%lu", asset.index + 1]; } } } @@ -107,7 +115,7 @@ - (void)cellTapped:(UITapGestureRecognizer *)tapRecognizer } else { - int lastElement = [[ELCConsole mainConsole] numOfSelectedElements] - 1; + NSUInteger lastElement = [[ELCConsole mainConsole] numOfSelectedElements] - 1; [[ELCConsole mainConsole] removeIndex:lastElement]; } break; diff --git a/Classes/ELCImagePicker/ELCAssetTablePicker.h b/Classes/ELCImagePicker/ELCAssetTablePicker.h index 8148ef6..74e35b4 100755 --- a/Classes/ELCImagePicker/ELCAssetTablePicker.h +++ b/Classes/ELCImagePicker/ELCAssetTablePicker.h @@ -14,11 +14,12 @@ @interface ELCAssetTablePicker : UITableViewController @property (nonatomic, weak) id parent; -@property (nonatomic, strong) ALAssetsGroup *assetGroup; +@property (nonatomic, strong) PHAssetCollection *assetGroup; @property (nonatomic, strong) NSMutableArray *elcAssets; @property (nonatomic, strong) IBOutlet UILabel *selectedAssetsLabel; @property (nonatomic, assign) BOOL singleSelection; @property (nonatomic, assign) BOOL immediateReturn; +@property (nonatomic, assign) NSNumber *assetsFilter; // optional, can be used to filter the assets displayed @property(nonatomic, weak) id assetPickerFilterDelegate; @@ -28,4 +29,4 @@ - (void)doneAction:(id)sender; -@end \ No newline at end of file +@end diff --git a/Classes/ELCImagePicker/ELCAssetTablePicker.m b/Classes/ELCImagePicker/ELCAssetTablePicker.m index 24830be..27a841f 100755 --- a/Classes/ELCImagePicker/ELCAssetTablePicker.m +++ b/Classes/ELCImagePicker/ELCAssetTablePicker.m @@ -10,8 +10,9 @@ #import "ELCAsset.h" #import "ELCAlbumPickerController.h" #import "ELCConsole.h" +#import -@interface ELCAssetTablePicker () +@interface ELCAssetTablePicker () @property (nonatomic, assign) int columns; @@ -51,7 +52,7 @@ - (void)viewDidLoad [self performSelectorInBackground:@selector(preparePhotos) withObject:nil]; // Register for notifications when the photo library has changed - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(preparePhotos) name:ALAssetsLibraryChangedNotification object:nil]; + [PHPhotoLibrary.sharedPhotoLibrary registerChangeObserver:self]; } - (void)viewWillAppear:(BOOL)animated @@ -64,7 +65,7 @@ - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [[ELCConsole mainConsole] removeAllIndex]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:ALAssetsLibraryChangedNotification object:nil]; + [PHPhotoLibrary.sharedPhotoLibrary unregisterChangeObserver:self]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation @@ -79,33 +80,38 @@ - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceO [self.tableView reloadData]; } +- (void)photoLibraryDidChange:(PHChange *)changeInstance { + [self preparePhotos]; +} + - (void)preparePhotos { @autoreleasepool { [self.elcAssets removeAllObjects]; - [self.assetGroup enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { - - if (result == nil) { - return; - } - - ELCAsset *elcAsset = [[ELCAsset alloc] initWithAsset:result]; + + PHFetchOptions *assetsFilter = [[PHFetchOptions alloc] init]; + // Filter out slow motion videos as processign them through PhotoKit is non-trivial + assetsFilter.predicate = [ELCAsset slowmoFilterPredicate]; + + PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsInAssetCollection:self.assetGroup options:assetsFilter]; + [assetsFetchResult enumerateObjectsUsingBlock:^(PHAsset * _Nonnull asset, NSUInteger idx, BOOL * _Nonnull stop) { + ELCAsset *elcAsset = [[ELCAsset alloc] initWithAsset:asset]; [elcAsset setParent:self]; BOOL isAssetFiltered = NO; if (self.assetPickerFilterDelegate && - [self.assetPickerFilterDelegate respondsToSelector:@selector(assetTablePicker:isAssetFilteredOut:)]) + [self.assetPickerFilterDelegate respondsToSelector:@selector(assetTablePicker:isAssetFilteredOut:)]) { isAssetFiltered = [self.assetPickerFilterDelegate assetTablePicker:self isAssetFilteredOut:(ELCAsset*)elcAsset]; } - + if (!isAssetFiltered) { [self.elcAssets addObject:elcAsset]; } - - }]; - + + }]; + dispatch_sync(dispatch_get_main_queue(), ^{ [self.tableView reloadData]; // scroll to bottom @@ -114,12 +120,12 @@ - (void)preparePhotos if (section >= 0 && row >= 0) { NSIndexPath *ip = [NSIndexPath indexPathForRow:row inSection:section]; - [self.tableView scrollToRowAtIndexPath:ip - atScrollPosition:UITableViewScrollPositionBottom - animated:NO]; + [self.tableView scrollToRowAtIndexPath:ip + atScrollPosition:UITableViewScrollPositionBottom + animated:NO]; } - [self.navigationItem setTitle:self.singleSelection ? NSLocalizedString(@"Pick Photo", nil) : NSLocalizedString(@"Pick Photos", nil)]; + [self.navigationItem setTitle:NSLocalizedString(@"ELCImagePicker_PickPhoto", nil)]; }); } } @@ -193,7 +199,7 @@ - (void)assetDeselected:(ELCAsset *)asset [(NSObject *)self.parent performSelector:@selector(selectedAssets:) withObject:singleAssetArray afterDelay:0]; } - int numOfSelectedElements = [[ELCConsole mainConsole] numOfSelectedElements]; + NSUInteger numOfSelectedElements = [[ELCConsole mainConsole] numOfSelectedElements]; if (asset.index < numOfSelectedElements - 1) { NSMutableArray *arrayOfCellsToReload = [[NSMutableArray alloc] initWithCapacity:1]; @@ -279,5 +285,4 @@ - (int)totalSelectedAssets return count; } - @end diff --git a/Classes/ELCImagePicker/ELCConsole.h b/Classes/ELCImagePicker/ELCConsole.h index eda755e..666b78e 100644 --- a/Classes/ELCImagePicker/ELCConsole.h +++ b/Classes/ELCImagePicker/ELCConsole.h @@ -14,9 +14,9 @@ } @property (nonatomic,assign) BOOL onOrder; + (ELCConsole *)mainConsole; -- (void)addIndex:(int)index; -- (void)removeIndex:(int)index; +- (void)addIndex:(NSUInteger)index; +- (void)removeIndex:(NSUInteger)index; - (int)currIndex; -- (int)numOfSelectedElements; +- (NSUInteger)numOfSelectedElements; - (void)removeAllIndex; @end diff --git a/Classes/ELCImagePicker/ELCConsole.m b/Classes/ELCImagePicker/ELCConsole.m index cc6e700..12f040c 100644 --- a/Classes/ELCImagePicker/ELCConsole.m +++ b/Classes/ELCImagePicker/ELCConsole.m @@ -34,14 +34,14 @@ - (void)dealloc _mainconsole = nil; } -- (void)addIndex:(int)index +- (void)addIndex:(NSUInteger)index { if (![myIndex containsObject:@(index)]) { [myIndex addObject:@(index)]; } } -- (void)removeIndex:(int)index +- (void)removeIndex:(NSUInteger)index { [myIndex removeObject:@(index)]; } @@ -64,7 +64,7 @@ - (int)currIndex return (int)[myIndex count]; } -- (int)numOfSelectedElements { +- (NSUInteger)numOfSelectedElements { return [myIndex count]; } diff --git a/Classes/ELCImagePicker/ELCImagePickerController.m b/Classes/ELCImagePicker/ELCImagePickerController.m index b7f3eda..540c8bd 100755 --- a/Classes/ELCImagePicker/ELCImagePickerController.m +++ b/Classes/ELCImagePicker/ELCImagePickerController.m @@ -14,6 +14,10 @@ #import #import #import "ELCConsole.h" +#import +#import "UIAlertController+Extensions.h" + +NSString const * ELCImagePickerControllerVideoDataKey = @"ELCImagePickerControllerVideoDataKey"; @implementation ELCImagePickerController @@ -73,11 +77,10 @@ - (BOOL)shouldSelectAsset:(ELCAsset *)asset previousCount:(NSUInteger)previousCo if (!shouldSelect) { NSString *title = [NSString stringWithFormat:NSLocalizedString(@"Only %d photos please!", nil), self.maximumImagesCount]; NSString *message = [NSString stringWithFormat:NSLocalizedString(@"You can only send %d photos at a time.", nil), self.maximumImagesCount]; - [[[UIAlertView alloc] initWithTitle:title - message:message - delegate:nil - cancelButtonTitle:nil - otherButtonTitles:NSLocalizedString(@"Okay", nil), nil] show]; + [UIAlertController showAlertWithTitle:title + message:message + cancelButton:NSLocalizedString(@"Okay", nil) + fromController:self]; } return shouldSelect; } @@ -91,54 +94,61 @@ - (void)selectedAssets:(NSArray *)assets { NSMutableArray *returnArray = [[NSMutableArray alloc] init]; + NSUInteger __block assetsLoaded = 0; + NSUInteger __block assetsToLoad = assets.count; for(ELCAsset *elcasset in assets) { - ALAsset *asset = elcasset.asset; - id obj = [asset valueForProperty:ALAssetPropertyType]; - if (!obj) { - continue; - } + PHAsset *asset = elcasset.asset; + PHAssetMediaType type = asset.mediaType; + NSMutableDictionary *workingDictionary = [[NSMutableDictionary alloc] init]; - CLLocation* wgs84Location = [asset valueForProperty:ALAssetPropertyLocation]; + CLLocation* wgs84Location = asset.location; if (wgs84Location) { - [workingDictionary setObject:wgs84Location forKey:ALAssetPropertyLocation]; + [workingDictionary setObject:wgs84Location forKey:@"Location"]; } - [workingDictionary setObject:obj forKey:UIImagePickerControllerMediaType]; + [workingDictionary setObject:@(type) forKey:UIImagePickerControllerMediaType]; //This method returns nil for assets from a shared photo stream that are not yet available locally. If the asset becomes available in the future, an ALAssetsLibraryChangedNotification notification is posted. - ALAssetRepresentation *assetRep = [asset defaultRepresentation]; - - if(assetRep != nil) { - if (_returnsImage) { - CGImageRef imgRef = nil; - //defaultRepresentation returns image as it appears in photo picker, rotated and sized, - //so use UIImageOrientationUp when creating our image below. - UIImageOrientation orientation = UIImageOrientationUp; - - if (_returnsOriginalImage) { - imgRef = [assetRep fullResolutionImage]; - orientation = [assetRep orientation]; - } else { - imgRef = [assetRep fullScreenImage]; + if (asset.mediaType == PHAssetMediaTypeVideo) { + PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init]; + options.networkAccessAllowed = NO; + [[PHImageManager defaultManager] requestAVAssetForVideo:asset options:options resultHandler:^(AVAsset * _Nullable asset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) { + NSData *data = [NSData dataWithContentsOfURL:((AVURLAsset*)asset).URL]; + [workingDictionary setObject:data forKey:ELCImagePickerControllerVideoDataKey]; + [returnArray addObject:workingDictionary]; + assetsLoaded ++; + if (assetsLoaded == assetsToLoad) { + [self notifyPickerCompleteWithArray:returnArray]; + } + }]; + } else { + PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; + options.synchronous = YES; + options.networkAccessAllowed = NO; + [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) { + if (result != nil) { + [workingDictionary setObject:result forKey:UIImagePickerControllerOriginalImage]; + } + [returnArray addObject:workingDictionary]; + assetsLoaded ++; + if (assetsLoaded == assetsToLoad) { + [self notifyPickerCompleteWithArray:returnArray]; } - UIImage *img = [UIImage imageWithCGImage:imgRef - scale:1.0f - orientation:orientation]; - [workingDictionary setObject:img forKey:UIImagePickerControllerOriginalImage]; - } - - [workingDictionary setObject:[[asset valueForProperty:ALAssetPropertyURLs] valueForKey:[[[asset valueForProperty:ALAssetPropertyURLs] allKeys] objectAtIndex:0]] forKey:UIImagePickerControllerReferenceURL]; - - [returnArray addObject:workingDictionary]; + }]; } - } - if (_imagePickerDelegate != nil && [_imagePickerDelegate respondsToSelector:@selector(elcImagePickerController:didFinishPickingMediaWithInfo:)]) { - [_imagePickerDelegate performSelector:@selector(elcImagePickerController:didFinishPickingMediaWithInfo:) withObject:self withObject:returnArray]; - } else { - [self popToRootViewControllerAnimated:NO]; - } + } +} + +- (void)notifyPickerCompleteWithArray:(NSArray*)assets { + dispatch_async(dispatch_get_main_queue(), ^{ + if (_imagePickerDelegate != nil && [_imagePickerDelegate respondsToSelector:@selector(elcImagePickerController:didFinishPickingMediaWithInfo:)]) { + [_imagePickerDelegate performSelector:@selector(elcImagePickerController:didFinishPickingMediaWithInfo:) withObject:self withObject:assets]; + } else { + [self popToRootViewControllerAnimated:NO]; + } + }); } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation diff --git a/Classes/ELCImagePicker/ELCOverlayImageView.h b/Classes/ELCImagePicker/ELCOverlayImageView.h index c2e90de..03c9f4a 100644 --- a/Classes/ELCImagePicker/ELCOverlayImageView.h +++ b/Classes/ELCImagePicker/ELCOverlayImageView.h @@ -12,6 +12,6 @@ @property (nonatomic, strong) UILabel *labIndex; -- (void)setIndex:(int)_index; +- (void)setIndex:(NSUInteger)_index; @end diff --git a/Classes/ELCImagePicker/ELCOverlayImageView.m b/Classes/ELCImagePicker/ELCOverlayImageView.m index f7b9b76..9dc342a 100644 --- a/Classes/ELCImagePicker/ELCOverlayImageView.m +++ b/Classes/ELCImagePicker/ELCOverlayImageView.m @@ -19,9 +19,9 @@ - (id)initWithFrame:(CGRect)frame return self; } -- (void)setIndex:(int)_index +- (void)setIndex:(NSUInteger)_index { - self.labIndex.text = [NSString stringWithFormat:@"%d",_index]; + self.labIndex.text = [NSString stringWithFormat:@"%lu",(unsigned long)_index]; } - (void)dealloc diff --git a/Classes/ELCImagePickerDemoViewController.m b/Classes/ELCImagePickerDemoViewController.m index 0b53ef2..e1d936b 100644 --- a/Classes/ELCImagePickerDemoViewController.m +++ b/Classes/ELCImagePickerDemoViewController.m @@ -9,11 +9,12 @@ #import "ELCImagePickerDemoAppDelegate.h" #import "ELCImagePickerDemoViewController.h" #import +#import @interface ELCImagePickerDemoViewController () -@property (nonatomic, strong) ALAssetsLibrary *specialLibrary; +@property (nonatomic, strong) PHFetchResult *specialLibrary; @end @@ -38,28 +39,20 @@ - (IBAction)launchController - (IBAction)launchSpecialController { - ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; - self.specialLibrary = library; - NSMutableArray *groups = [NSMutableArray array]; - [_specialLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) { - if (group) { - [groups addObject:group]; - } else { - // this is the end - [self displayPickerForGroup:[groups objectAtIndex:0]]; - } - } failureBlock:^(NSError *error) { - self.chosenImages = nil; - UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[NSString stringWithFormat:@"Album Error: %@ - %@", [error localizedDescription], [error localizedRecoverySuggestion]] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; - [alert show]; - - NSLog(@"A problem occured %@", [error description]); - // an error here means that the asset groups were inaccessable. - // Maybe the user or system preferences refused access. - }]; + PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeMoment + subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; + self.specialLibrary = smartAlbums; + + NSMutableArray *groups = [NSMutableArray new]; + for (int i = 0; i < smartAlbums.count; i++) { + [groups addObject:smartAlbums[i]]; + } + if (groups.count > 0) { + [self displayPickerForGroup:[groups objectAtIndex:0]]; + } } -- (void)displayPickerForGroup:(ALAssetsGroup *)group +- (void)displayPickerForGroup:(PHAssetCollection *)group { ELCAssetTablePicker *tablePicker = [[ELCAssetTablePicker alloc] initWithStyle:UITableViewStylePlain]; tablePicker.singleSelection = YES; @@ -75,7 +68,7 @@ - (void)displayPickerForGroup:(ALAssetsGroup *)group // Move me tablePicker.assetGroup = group; - [tablePicker.assetGroup setAssetsFilter:[ALAssetsFilter allAssets]]; +// [tablePicker.assetGroup setAssetsFilter:[ALAssetsFilter allAssets]]; [self presentViewController:elcPicker animated:YES completion:nil]; } @@ -104,7 +97,8 @@ - (void)elcImagePickerController:(ELCImagePickerController *)picker didFinishPic NSMutableArray *images = [NSMutableArray arrayWithCapacity:[info count]]; for (NSDictionary *dict in info) { - if ([dict objectForKey:UIImagePickerControllerMediaType] == ALAssetTypePhoto){ + NSNumber *mediaType = [dict objectForKey:UIImagePickerControllerMediaType]; + if (mediaType.longValue == PHAssetMediaTypeImage){ if ([dict objectForKey:UIImagePickerControllerOriginalImage]){ UIImage* image=[dict objectForKey:UIImagePickerControllerOriginalImage]; [images addObject:image]; @@ -119,7 +113,7 @@ - (void)elcImagePickerController:(ELCImagePickerController *)picker didFinishPic } else { NSLog(@"UIImagePickerControllerReferenceURL = %@", dict); } - } else if ([dict objectForKey:UIImagePickerControllerMediaType] == ALAssetTypeVideo){ + } else if (mediaType.longValue == PHAssetMediaTypeVideo){ if ([dict objectForKey:UIImagePickerControllerOriginalImage]){ UIImage* image=[dict objectForKey:UIImagePickerControllerOriginalImage]; diff --git a/Classes/Helpers/UIAlertController+Extensions.h b/Classes/Helpers/UIAlertController+Extensions.h new file mode 100644 index 0000000..db0fab6 --- /dev/null +++ b/Classes/Helpers/UIAlertController+Extensions.h @@ -0,0 +1,15 @@ +// +// UIAlertController+Extensions.h +// ELCImagePickerDemo +// +// Created by Alin Baciu on 03/12/2017. +// Copyright © 2017 ELC Technologies. All rights reserved. +// + +#import + +@interface UIAlertController (Extensions) + ++ (void)showAlertWithTitle:(NSString *)title message:(NSString *)message cancelButton:(NSString *)cancel fromController:(UIViewController*)controller; + +@end diff --git a/Classes/Helpers/UIAlertController+Extensions.m b/Classes/Helpers/UIAlertController+Extensions.m new file mode 100644 index 0000000..696e7c7 --- /dev/null +++ b/Classes/Helpers/UIAlertController+Extensions.m @@ -0,0 +1,31 @@ +// +// UIAlertController+Extensions.m +// ELCImagePickerDemo +// +// Created by Alin Baciu on 03/12/2017. +// Copyright © 2017 ELC Technologies. All rights reserved. +// + +#import "UIAlertController+Extensions.h" + + +@implementation UIAlertController (Extensions) + ++ (void)showAlertWithTitle:(NSString *)title message:(NSString *)message cancelButton:(NSString *)cancel fromController:(UIViewController*)controller { + UIAlertController* alertView = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert]; + if (cancel.length > 0) { + UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:cancel style:UIAlertActionStyleCancel handler:nil]; + [alertView addAction:cancelAction]; + } + + [alertView showAlertFromController:controller completion:nil]; +} + +- (void)showAlertFromController:(UIViewController *)controller completion:(void (^)(void))completion { + self.popoverPresentationController.sourceView = controller.view; + self.popoverPresentationController.sourceRect = controller.view.frame; + self.popoverPresentationController.permittedArrowDirections = 0; + [controller presentViewController:self animated:YES completion:completion]; +} + +@end diff --git a/ELCImagePickerDemo-Info.plist b/ELCImagePickerDemo-Info.plist index 5a79e77..51350da 100644 --- a/ELCImagePickerDemo-Info.plist +++ b/ELCImagePickerDemo-Info.plist @@ -2,6 +2,8 @@ + NSPhotoLibraryUsageDescription + Stuff CFBundleDevelopmentRegion English CFBundleDisplayName diff --git a/ELCImagePickerDemo.xcodeproj/project.pbxproj b/ELCImagePickerDemo.xcodeproj/project.pbxproj index eeecc92..b8452b4 100755 --- a/ELCImagePickerDemo.xcodeproj/project.pbxproj +++ b/ELCImagePickerDemo.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 0323CC871FD460E100F08879 /* Photos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0323CC861FD4608F00F08879 /* Photos.framework */; }; + 0323CC8B1FD46B9800F08879 /* UIAlertController+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 0323CC8A1FD46B9800F08879 /* UIAlertController+Extensions.m */; }; 0B67B05B17E0ED1F002CC2C5 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0B67B05A17E0ED1F002CC2C5 /* Default-568h@2x.png */; }; 1A2C100517026CF0004FAFA0 /* ELCAssetTablePicker.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A2C0FFB17026CF0004FAFA0 /* ELCAssetTablePicker.m */; }; 1A2C100617026CF0004FAFA0 /* ELCImagePickerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A2C0FFC17026CF0004FAFA0 /* ELCImagePickerController.m */; }; @@ -27,12 +29,14 @@ 4AAFDA62194840F20020FCC4 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4AAFDA61194840F20020FCC4 /* MobileCoreServices.framework */; }; 83C6BC9714476B280064D71D /* elc-ios-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83C6BC9514476B280064D71D /* elc-ios-icon@2x.png */; }; 83C6BC9814476B280064D71D /* elc-ios-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 83C6BC9614476B280064D71D /* elc-ios-icon.png */; }; - E29A5E3C1239C42A008BB149 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E29A5E3B1239C42A008BB149 /* AssetsLibrary.framework */; }; F1DF7842196FA475003524A2 /* ELCConsole.m in Sources */ = {isa = PBXBuildFile; fileRef = F1DF783F196FA475003524A2 /* ELCConsole.m */; }; F1DF7843196FA475003524A2 /* ELCOverlayImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = F1DF7841196FA475003524A2 /* ELCOverlayImageView.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 0323CC861FD4608F00F08879 /* Photos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Photos.framework; path = System/Library/Frameworks/Photos.framework; sourceTree = SDKROOT; }; + 0323CC891FD46B9800F08879 /* UIAlertController+Extensions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIAlertController+Extensions.h"; sourceTree = ""; }; + 0323CC8A1FD46B9800F08879 /* UIAlertController+Extensions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIAlertController+Extensions.m"; sourceTree = ""; }; 0B67B05A17E0ED1F002CC2C5 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 1A2C0FFA17026CF0004FAFA0 /* ELCAssetTablePicker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ELCAssetTablePicker.h; sourceTree = ""; }; 1A2C0FFB17026CF0004FAFA0 /* ELCAssetTablePicker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ELCAssetTablePicker.m; sourceTree = ""; }; @@ -78,20 +82,30 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 0323CC871FD460E100F08879 /* Photos.framework in Frameworks */, 4AAFDA62194840F20020FCC4 /* MobileCoreServices.framework in Frameworks */, 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */, - E29A5E3C1239C42A008BB149 /* AssetsLibrary.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 0323CC881FD46B6A00F08879 /* Helpers */ = { + isa = PBXGroup; + children = ( + 0323CC891FD46B9800F08879 /* UIAlertController+Extensions.h */, + 0323CC8A1FD46B9800F08879 /* UIAlertController+Extensions.m */, + ); + path = Helpers; + sourceTree = ""; + }; 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( + 0323CC881FD46B6A00F08879 /* Helpers */, 4252A0981593013500086D05 /* ELCImagePicker */, 1D3623240D0F684500981E51 /* ELCImagePickerDemoAppDelegate.h */, 1D3623250D0F684500981E51 /* ELCImagePickerDemoAppDelegate.m */, @@ -157,6 +171,7 @@ 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( + 0323CC861FD4608F00F08879 /* Photos.framework */, 4AAFDA61194840F20020FCC4 /* MobileCoreServices.framework */, E29A5E3B1239C42A008BB149 /* AssetsLibrary.framework */, 288765A40DF7441C002DB57D /* CoreGraphics.framework */, @@ -261,6 +276,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 0323CC8B1FD46B9800F08879 /* UIAlertController+Extensions.m in Sources */, 1D60589B0D05DD56006BFB54 /* main.m in Sources */, 1D3623260D0F684500981E51 /* ELCImagePickerDemoAppDelegate.m in Sources */, F1DF7842196FA475003524A2 /* ELCConsole.m in Sources */, @@ -290,7 +306,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = ELCImagePickerDemo_Prefix.pch; INFOPLIST_FILE = "ELCImagePickerDemo-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; PRODUCT_NAME = ELCImagePickerDemo; PROVISIONING_PROFILE = ""; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; @@ -308,7 +324,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = ELCImagePickerDemo_Prefix.pch; INFOPLIST_FILE = "ELCImagePickerDemo-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; PRODUCT_NAME = ELCImagePickerDemo; PROVISIONING_PROFILE = ""; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/ELCImagePickerDemoViewController.xib b/ELCImagePickerDemoViewController.xib index 61b2713..a88f75a 100644 --- a/ELCImagePickerDemoViewController.xib +++ b/ELCImagePickerDemoViewController.xib @@ -1,334 +1,65 @@ - - - 1552 - 12D78 - 3084 - 1187.37 - 626.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 2083 - - - YES - IBProxyObject - IBUIButton - IBUIScrollView - IBUIView - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - YES - - - 292 - {{20, 20}, {128, 37}} - - - - NO - IBCocoaTouchFramework - 0 - 0 - 1 - Normal Picker - - 3 - MQA - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - Helvetica-Bold - Helvetica - 2 - 15 - - - Helvetica-Bold - 15 - 16 - - - - - 274 - {{20, 65}, {280, 375}} - - - YES - YES - IBCocoaTouchFramework - - - - 292 - {{172, 20}, {128, 37}} - - - - NO - IBCocoaTouchFramework - 0 - 0 - 1 - Limited Picker - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - {{0, 20}, {320, 460}} - - - - - 3 - MC43NQA - - 2 - - - NO - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 7 - - - - scrollView - - - - 20 - - - - launchController - - - 7 - - 9 - - - - delegate - - - - 15 - - - - launchSpecialController - - - 7 - - 19 - - - - - YES - - 0 - - YES - - - - - - -1 - - - File's Owner - - - -2 - - - - - 6 - - - YES - - - - - - - - 8 - - - - - 10 - - - - - 16 - - - - - - - YES - - YES - -1.CustomClassName - -1.IBPluginDependency - -2.CustomClassName - -2.IBPluginDependency - 10.IBPluginDependency - 16.IBPluginDependency - 6.IBPluginDependency - 8.IBPluginDependency - - - YES - ELCImagePickerDemoViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - - - - YES - - - - - 20 - - - - YES - - ELCImagePickerDemoViewController - UIViewController - - YES - - YES - launchController - launchSpecialController - - - YES - id - id - - - - YES - - YES - launchController - launchSpecialController - - - YES - - launchController - id - - - launchSpecialController - id - - - - - scrollView - UIScrollView - - - scrollView - - scrollView - UIScrollView - - - - IBProjectSource - ./Classes/ELCImagePickerDemoViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - 2083 - - + + + + + + + + + Helvetica-Bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MainWindow.xib b/MainWindow.xib index 5eb79dd..d055f4c 100644 --- a/MainWindow.xib +++ b/MainWindow.xib @@ -1,444 +1,34 @@ - - - 1024 - 10D571 - 786 - 1038.29 - 460.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 112 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - IBCocoaTouchFramework - - - ELCImagePickerDemoViewController - - - 1 - - IBCocoaTouchFramework - NO - - - - 292 - {320, 480} - - 1 - MSAxIDEAA - - NO - NO - - IBCocoaTouchFramework - YES - - - - - YES - - - delegate - - - - 4 - - - - viewController - - - - 11 - - - - window - - - - 14 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - 3 - - - ELCImagePickerDemo App Delegate - - - -2 - - - - - 10 - - - - - 12 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 10.CustomClassName - 10.IBEditorWindowLastContentRect - 10.IBPluginDependency - 12.IBEditorWindowLastContentRect - 12.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - - - YES - UIApplication - UIResponder - ELCImagePickerDemoViewController - {{234, 376}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - {{525, 346}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - ELCImagePickerDemoAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 15 - - - - YES - - UIWindow - UIView - - IBUserSource - - - - - ELCImagePickerDemoAppDelegate - NSObject - - YES - - YES - viewController - window - - - YES - ELCImagePickerDemoViewController - UIWindow - - - - YES - - YES - viewController - window - - - YES - - viewController - ELCImagePickerDemoViewController - - - window - UIWindow - - - - - IBProjectSource - Classes/ELCImagePickerDemoAppDelegate.h - - - - ELCImagePickerDemoAppDelegate - NSObject - - IBUserSource - - - - - ELCImagePickerDemoViewController - UIViewController - - IBProjectSource - Classes/ELCImagePickerDemoViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIApplication - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIApplication.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWindow - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWindow.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ELCImagePickerDemo.xcodeproj - 3 - 112 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iPad/MainWindow-iPad.xib b/iPad/MainWindow-iPad.xib index 82d3f60..74dfa74 100644 --- a/iPad/MainWindow-iPad.xib +++ b/iPad/MainWindow-iPad.xib @@ -1,202 +1,34 @@ - - - 1024 - 11E53 - 2549 - 1138.47 - 569.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1498 - - - YES - IBProxyObject - IBUICustomObject - IBUIViewController - IBUIWindow - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - IBIPadFramework - - - ELCImagePickerDemoViewController - - 2 - - - 1 - 1 - - IBIPadFramework - NO - - - - 292 - {768, 1024} - - 1 - MSAxIDEAA - - NO - NO - - IBIPadFramework - YES - - - - - YES - - - delegate - - - - 4 - - - - viewController - - - - 11 - - - - window - - - - 14 - - - - - YES - - 0 - - YES - - - - - - -1 - - - File's Owner - - - 3 - - - ELCImagePickerDemo App Delegate - - - -2 - - - - - 10 - - - - - 12 - - - - - - - YES - - YES - -1.CustomClassName - -1.IBPluginDependency - -2.CustomClassName - -2.IBPluginDependency - 10.CustomClassName - 10.IBLastUsedUIStatusBarStylesToTargetRuntimesMap - 10.IBPluginDependency - 12.IBLastUsedUIStatusBarStylesToTargetRuntimesMap - 12.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - - - YES - UIApplication - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - ELCImagePickerDemoViewController - - IBCocoaTouchFramework - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - IBCocoaTouchFramework - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - ELCImagePickerDemoAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - - - - YES - - - - - 15 - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - 1498 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +