From 93ce8cafa245616a8c0debaf454ab8e7121351f6 Mon Sep 17 00:00:00 2001 From: SpringOx Date: Sun, 12 Jan 2014 18:55:04 +0800 Subject: [PATCH 01/18] =?UTF-8?q?fixed=20bugs,=20including=20=E2=80=9CNo?= =?UTF-8?q?=20thumbnails=20are=20shown=20on=20iOS7=E2=80=9D=20=E2=80=9Cgho?= =?UTF-8?q?st=20thumbnail=E2=80=9D.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project.pbxproj | 4 + .../AGViewController.m | 2 +- .../AGIPCAssetsController.h | 1 + .../AGIPCAssetsController.m | 73 +++++++++++++------ AGImagePickerController/AGIPCGridCell.m | 22 ++++-- AGImagePickerController/AGIPCGridItem.h | 2 + AGImagePickerController/AGIPCGridItem.m | 50 ++++++++++--- .../AGImagePickerController.h | 1 + .../AGImagePickerController.m | 7 ++ 9 files changed, 121 insertions(+), 41 deletions(-) diff --git a/AGImagePickerController Demo.xcodeproj/project.pbxproj b/AGImagePickerController Demo.xcodeproj/project.pbxproj index 5738d74..9cf6c7d 100644 --- a/AGImagePickerController Demo.xcodeproj/project.pbxproj +++ b/AGImagePickerController Demo.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 54A1E5551882A31E00D556FD /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54A1E5541882A31E00D556FD /* CoreLocation.framework */; }; FE1E332914ED167800F6A6A2 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FE1E332814ED167800F6A6A2 /* UIKit.framework */; }; FE1E332B14ED167800F6A6A2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FE1E332A14ED167800F6A6A2 /* Foundation.framework */; }; FE1E333314ED167800F6A6A2 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = FE1E333114ED167800F6A6A2 /* InfoPlist.strings */; }; @@ -33,6 +34,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 54A1E5541882A31E00D556FD /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; FE1E332414ED167800F6A6A2 /* AGImagePickerController Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "AGImagePickerController Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; FE1E332814ED167800F6A6A2 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; FE1E332A14ED167800F6A6A2 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -78,6 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 54A1E5551882A31E00D556FD /* CoreLocation.framework in Frameworks */, FEDAA95516C2F3D600234FF0 /* AssetsLibrary.framework in Frameworks */, FE1E332914ED167800F6A6A2 /* UIKit.framework in Frameworks */, FE1E332B14ED167800F6A6A2 /* Foundation.framework in Frameworks */, @@ -109,6 +112,7 @@ FE1E332714ED167800F6A6A2 /* Frameworks */ = { isa = PBXGroup; children = ( + 54A1E5541882A31E00D556FD /* CoreLocation.framework */, FEA599E114ED30140057FF9C /* AssetsLibrary.framework */, FE1E332814ED167800F6A6A2 /* UIKit.framework */, FE1E332A14ED167800F6A6A2 /* Foundation.framework */, diff --git a/AGImagePickerController Demo/AGViewController.m b/AGImagePickerController Demo/AGViewController.m index b291a0a..66314e8 100644 --- a/AGImagePickerController Demo/AGViewController.m +++ b/AGImagePickerController Demo/AGViewController.m @@ -109,7 +109,7 @@ - (void)openAction:(id)sender ipc.shouldShowSavedPhotosOnTop = NO; ipc.shouldChangeStatusBarStyle = YES; ipc.selection = self.selectedPhotos; -// ipc.maximumNumberOfPhotosToBeSelected = 1; +// ipc.maximumNumberOfPhotosToBeSelected = 10; // Custom toolbar items AGIPCToolbarItem *selectAll = [[AGIPCToolbarItem alloc] initWithBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"+ Select All" style:UIBarButtonItemStyleBordered target:nil action:nil] andSelectionBlock:^BOOL(NSUInteger index, ALAsset *asset) { diff --git a/AGImagePickerController/AGIPCAssetsController.h b/AGImagePickerController/AGIPCAssetsController.h index f5b80a6..a10129e 100644 --- a/AGImagePickerController/AGIPCAssetsController.h +++ b/AGImagePickerController/AGIPCAssetsController.h @@ -11,6 +11,7 @@ #import #import +#import #import "AGImagePickerController.h" #import "AGIPCGridItem.h" diff --git a/AGImagePickerController/AGIPCAssetsController.m b/AGImagePickerController/AGIPCAssetsController.m index cf1d9c6..5e74154 100644 --- a/AGImagePickerController/AGIPCAssetsController.m +++ b/AGImagePickerController/AGIPCAssetsController.m @@ -125,11 +125,17 @@ - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerContro self.assetsGroup = assetsGroup; self.imagePickerController = imagePickerController; self.title = NSLocalizedStringWithDefaultValue(@"AGIPC.Loading", nil, [NSBundle mainBundle], @"Loading...", nil); + self.title = [self.assetsGroup valueForProperty:ALAssetsGroupPropertyName]; self.tableView.allowsMultipleSelection = NO; self.tableView.allowsSelection = NO; self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; + // Navigation Bar Items + UIBarButtonItem *doneButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneAction:)]; + doneButtonItem.enabled = NO; + self.navigationItem.rightBarButtonItem = doneButtonItem; + // Setup toolbar items [self setupToolbarItems]; @@ -140,6 +146,11 @@ - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerContro return self; } +- (void)dealloc +{ + [self unregisterFromNotifications]; +} + #pragma mark - UITableViewDataSource Methods - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section @@ -228,11 +239,6 @@ - (void)viewDidLoad // Setup Notifications [self registerForNotifications]; - - // Navigation Bar Items - UIBarButtonItem *doneButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneAction:)]; - doneButtonItem.enabled = NO; - self.navigationItem.rightBarButtonItem = doneButtonItem; } - (void)viewDidUnload @@ -271,7 +277,6 @@ - (void)setupToolbarItems NSArray *toolbarItemsForManagingTheSelection = @[selectAll, flexibleSpace, deselectAll]; self.toolbarItems = toolbarItemsForManagingTheSelection; - } } @@ -281,7 +286,7 @@ - (void)loadAssets __ag_weak AGIPCAssetsController *weakSelf = self; - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ __strong AGIPCAssetsController *strongSelf = weakSelf; @@ -292,14 +297,28 @@ - (void)loadAssets { return; } + if (strongSelf.imagePickerController.shouldShowPhotosWithLocationOnly) { + CLLocation *assetLocation = [result valueForProperty:ALAssetPropertyLocation]; + if (!assetLocation || !CLLocationCoordinate2DIsValid([assetLocation coordinate])) { + return; + } + } + + AGIPCGridItem *gridItem = [[AGIPCGridItem alloc] initWithImagePickerController:self.imagePickerController asset:result andDelegate:self]; - AGIPCGridItem *gridItem = [[AGIPCGridItem alloc] initWithImagePickerController:strongSelf.imagePickerController asset:result andDelegate:strongSelf]; - if ( strongSelf.imagePickerController.selection != nil && + // Drawing must be exectued in main thread. springox(20131220) + /* + if (strongSelf.imagePickerController.selection != nil && [strongSelf.imagePickerController.selection containsObject:result]) { gridItem.selected = YES; } - [strongSelf.assets addObject:gridItem]; + */ + + //[strongSelf.assets addObject:gridItem]; + // Descending photos, springox(20131225) + [strongSelf.assets insertObject:gridItem atIndex:0]; + }]; } @@ -308,7 +327,7 @@ - (void)loadAssets [strongSelf reloadData]; }); - + }); } @@ -318,16 +337,17 @@ - (void)reloadData [self.navigationController setToolbarHidden:[self toolbarHidden] animated:YES]; [self.tableView reloadData]; - [self setTitle:[self.assetsGroup valueForProperty:ALAssetsGroupPropertyName]]; + + //[self setTitle:[self.assetsGroup valueForProperty:ALAssetsGroupPropertyName]]; [self changeSelectionInformation]; + /* NSInteger totalRows = [self.tableView numberOfRowsInSection:0]; - - //Prevents crash if totalRows = 0 (when the album is empty). + //Prevents crash if totalRows = 0 (when the album is empty). if (totalRows > 0) { - [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:totalRows-1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:NO]; } + */ } - (void)doneAction:(id)sender @@ -372,8 +392,19 @@ - (void)customBarButtonItemAction:(id)sender - (void)changeSelectionInformation { - if (self.imagePickerController.shouldDisplaySelectionInformation) { - self.navigationController.navigationBar.topItem.prompt = [NSString stringWithFormat:@"(%d/%d)", [AGIPCGridItem numberOfSelections], self.assets.count]; + if (self.imagePickerController.shouldDisplaySelectionInformation ) { + if (0 == [AGIPCGridItem numberOfSelections] ) { + self.navigationController.navigationBar.topItem.prompt = nil; + } else { + //self.navigationController.navigationBar.topItem.prompt = [NSString stringWithFormat:@"(%d/%d)", [AGIPCGridItem numberOfSelections], self.assets.count]; + // Display supports up to select several photos at the same time, springox(20131220) + NSInteger maxNumber = _imagePickerController.maximumNumberOfPhotosToBeSelected; + if (0 < maxNumber) { + self.navigationController.navigationBar.topItem.prompt = [NSString stringWithFormat:@"(%d/%d)", [AGIPCGridItem numberOfSelections], maxNumber]; + } else { + self.navigationController.navigationBar.topItem.prompt = [NSString stringWithFormat:@"(%d/%d)", [AGIPCGridItem numberOfSelections], self.assets.count]; + } + } } } @@ -387,15 +418,13 @@ - (void)agGridItem:(AGIPCGridItem *)gridItem didChangeNumberOfSelections:(NSNumb - (BOOL)agGridItemCanSelect:(AGIPCGridItem *)gridItem { - if (self.imagePickerController.selectionMode == AGImagePickerControllerSelectionModeSingle && self.imagePickerController.selectionBehaviorInSingleSelectionMode == AGImagePickerControllerSelectionBehaviorTypeRadio) - { + if (self.imagePickerController.selectionMode == AGImagePickerControllerSelectionModeSingle && self.imagePickerController.selectionBehaviorInSingleSelectionMode == AGImagePickerControllerSelectionBehaviorTypeRadio) { for (AGIPCGridItem *item in self.assets) if (item.selected) item.selected = NO; return YES; - } else - { + } else { if (self.imagePickerController.maximumNumberOfPhotosToBeSelected > 0) return ([AGIPCGridItem numberOfSelections] < self.imagePickerController.maximumNumberOfPhotosToBeSelected); else @@ -430,4 +459,4 @@ - (void)didChangeToolbarItemsForManagingTheSelection:(NSNotification *)notificat NSLog(@"here."); } -@end \ No newline at end of file +@end diff --git a/AGImagePickerController/AGIPCGridCell.m b/AGImagePickerController/AGIPCGridCell.m index 0c99573..540523d 100644 --- a/AGImagePickerController/AGIPCGridCell.m +++ b/AGImagePickerController/AGIPCGridCell.m @@ -35,12 +35,17 @@ - (void)setItems:(NSArray *)items { if (_items != items) { - for (UIView *view in [self subviews]) - { + _items = items; + + for (UIView *view in [self.contentView subviews]) + { [view removeFromSuperview]; } - _items = items; + for (AGIPCGridItem *gridItem in _items) + { + [self addSubview:gridItem]; + } } } } @@ -82,14 +87,15 @@ - (void)layoutSubviews CGFloat leftMargin = frame.origin.x; for (AGIPCGridItem *gridItem in self.items) - { - [gridItem setFrame:frame]; + { + // Load image with asset when layout grid items. springox(20131218) + [gridItem loadImageFromAsset]; + + [gridItem setFrame:frame]; UITapGestureRecognizer *selectionGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:gridItem action:@selector(tap)]; selectionGestureRecognizer.numberOfTapsRequired = 1; [gridItem addGestureRecognizer:selectionGestureRecognizer]; - - [self addSubview:gridItem]; - + frame.origin.x = frame.origin.x + frame.size.width + leftMargin; } } diff --git a/AGImagePickerController/AGIPCGridItem.h b/AGImagePickerController/AGIPCGridItem.h index 956a017..ac609ce 100644 --- a/AGImagePickerController/AGIPCGridItem.h +++ b/AGImagePickerController/AGIPCGridItem.h @@ -40,6 +40,8 @@ - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerController andAsset:(ALAsset *)asset; - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerController asset:(ALAsset *)asset andDelegate:(id)delegate; +- (void)loadImageFromAsset; + - (void)tap; + (NSUInteger)numberOfSelections; diff --git a/AGImagePickerController/AGIPCGridItem.m b/AGImagePickerController/AGIPCGridItem.m index abc062c..5ef441d 100644 --- a/AGImagePickerController/AGIPCGridItem.m +++ b/AGImagePickerController/AGIPCGridItem.m @@ -105,7 +105,8 @@ - (void)setAsset:(ALAsset *)asset if (_asset != asset) { _asset = asset; - self.thumbnailImageView.image = [UIImage imageWithCGImage:_asset.thumbnail]; + // Drawing must be exectued in main thread. springox(20131218) + //self.thumbnailImageView.image = [UIImage imageWithCGImage:_asset.thumbnail]; } } } @@ -140,22 +141,25 @@ - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerContro CGRect checkmarkFrame = [self.imagePickerController checkmarkFrameUsingItemFrame:frame]; self.thumbnailImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)]; - self.thumbnailImageView.contentMode = UIViewContentModeScaleToFill; + // Drawing must be exectued in main thread. springox(20131220) + //self.thumbnailImageView.contentMode = UIViewContentModeScaleToFill; [self addSubview:self.thumbnailImageView]; self.selectionView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)]; - self.selectionView.backgroundColor = [UIColor whiteColor]; - self.selectionView.alpha = .5f; - self.selectionView.hidden = !self.selected; + // Drawing must be exectued in main thread. springox(20131220) + //self.selectionView.backgroundColor = [UIColor whiteColor]; + //self.selectionView.alpha = .5f; + //self.selectionView.hidden = !self.selected; [self addSubview:self.selectionView]; // Position the checkmark image in the bottom right corner self.checkmarkImageView = [[UIImageView alloc] initWithFrame:checkmarkFrame]; - if (IS_IPAD()) - self.checkmarkImageView.image = [UIImage imageNamed:@"AGImagePickerController.bundle/AGIPC-Checkmark-iPad"]; - else - self.checkmarkImageView.image = [UIImage imageNamed:@"AGImagePickerController.bundle/AGIPC-Checkmark-iPhone"]; - self.checkmarkImageView.hidden = !self.selected; + // Drawing must be exectued in main thread. springox(20131220) + //if (IS_IPAD()) + // self.checkmarkImageView.image = [UIImage imageNamed:@"AGImagePickerController.bundle/AGIPC-Checkmark-iPad"]; + //else + // self.checkmarkImageView.image = [UIImage imageNamed:@"AGImagePickerController.bundle/AGIPC-Checkmark-iPhone"]; + //self.checkmarkImageView.hidden = !self.selected; [self addSubview:self.checkmarkImageView]; self.asset = asset; @@ -164,6 +168,32 @@ - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerContro return self; } +- (void)layoutSubviews +{ + [super layoutSubviews]; + + self.thumbnailImageView.contentMode = UIViewContentModeScaleToFill; + + self.selectionView.backgroundColor = [UIColor whiteColor]; + self.selectionView.alpha = .5f; + self.selectionView.hidden = !self.selected; + + if (IS_IPAD()) + self.checkmarkImageView.image = [UIImage imageNamed:@"AGImagePickerController.bundle/AGIPC-Checkmark-iPad"]; + else + self.checkmarkImageView.image = [UIImage imageNamed:@"AGImagePickerController.bundle/AGIPC-Checkmark-iPhone"]; + self.checkmarkImageView.hidden = !self.selected; +} + +// Drawing must be exectued in main thread. springox(20131218) +- (void)loadImageFromAsset +{ + self.thumbnailImageView.image = [UIImage imageWithCGImage:_asset.thumbnail]; + if ([self.imagePickerController.selection containsObject:self]) { + self.selected = YES; + } +} + #pragma mark - Others - (void)tap diff --git a/AGImagePickerController/AGImagePickerController.h b/AGImagePickerController/AGImagePickerController.h index d5e38f8..3dad647 100644 --- a/AGImagePickerController/AGImagePickerController.h +++ b/AGImagePickerController/AGImagePickerController.h @@ -68,6 +68,7 @@ shouldShowToolbarForManagingTheSelectionInSelectionMode:(AGImagePickerController @property (nonatomic) BOOL shouldChangeStatusBarStyle; @property (nonatomic) BOOL shouldShowSavedPhotosOnTop; +@property (nonatomic) BOOL shouldShowPhotosWithLocationOnly; @property (nonatomic) NSUInteger maximumNumberOfPhotosToBeSelected; @property (nonatomic, ag_weak) id delegate; diff --git a/AGImagePickerController/AGImagePickerController.m b/AGImagePickerController/AGImagePickerController.m index 6af95af..7183ea1 100644 --- a/AGImagePickerController/AGImagePickerController.m +++ b/AGImagePickerController/AGImagePickerController.m @@ -124,9 +124,16 @@ - (id)initWithDelegate:(id)delegate self.shouldChangeStatusBarStyle = shouldChangeStatusBarStyle; self.shouldShowSavedPhotosOnTop = shouldShowSavedPhotosOnTop; + /* self.navigationBar.barStyle = UIBarStyleBlack; self.navigationBar.translucent = YES; self.toolbar.barStyle = UIBarStyleBlack; + self.toolbar.translucent = YES; + */ + // change the bar style for ios7, springox(20131225) + self.navigationBar.barStyle = UIBarStyleDefault; + self.navigationBar.translucent = YES; + self.toolbar.barStyle = UIBarStyleDefault; self.toolbar.translucent = YES; self.toolbarItemsForManagingTheSelection = toolbarItemsForManagingTheSelection; From 2c57055f440ee99d1cac7135a529f08db9730980 Mon Sep 17 00:00:00 2001 From: SpringOx Date: Fri, 7 Mar 2014 01:45:21 +0800 Subject: [PATCH 02/18] optimize the location feature --- AGImagePickerController/AGIPCAlbumsController.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/AGImagePickerController/AGIPCAlbumsController.m b/AGImagePickerController/AGIPCAlbumsController.m index b16a88a..8eeb4d6 100644 --- a/AGImagePickerController/AGIPCAlbumsController.m +++ b/AGImagePickerController/AGIPCAlbumsController.m @@ -217,7 +217,9 @@ - (void)loadAssetsGroups - (void)reloadData { [self.tableView reloadData]; - self.title = NSLocalizedStringWithDefaultValue(@"AGIPC.Albums", nil, [NSBundle mainBundle], @"Albums", nil); + // Modified by springox(20140306) + //self.title = NSLocalizedStringWithDefaultValue(@"AGIPC.Albums", nil, [NSBundle mainBundle], @"Albums", nil); + self.title = NSLocalizedString(@"Albums", @"text"); } - (void)cancelAction:(id)sender From 6eed12b12615c4a8c994d156386f2656d8fef7f6 Mon Sep 17 00:00:00 2001 From: jiachunke Date: Thu, 27 Mar 2014 18:25:49 +0800 Subject: [PATCH 03/18] optimize the sort algorithm --- .../AGViewController.m | 6 +-- .../AGIPCAlbumsController.m | 39 ++++++++++++++----- .../AGIPCAssetsController.m | 2 +- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/AGImagePickerController Demo/AGViewController.m b/AGImagePickerController Demo/AGViewController.m index 66314e8..dabbc3b 100644 --- a/AGImagePickerController Demo/AGViewController.m +++ b/AGImagePickerController Demo/AGViewController.m @@ -109,7 +109,7 @@ - (void)openAction:(id)sender ipc.shouldShowSavedPhotosOnTop = NO; ipc.shouldChangeStatusBarStyle = YES; ipc.selection = self.selectedPhotos; -// ipc.maximumNumberOfPhotosToBeSelected = 10; + //ipc.maximumNumberOfPhotosToBeSelected = 10; // Custom toolbar items AGIPCToolbarItem *selectAll = [[AGIPCToolbarItem alloc] initWithBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"+ Select All" style:UIBarButtonItemStyleBordered target:nil action:nil] andSelectionBlock:^BOOL(NSUInteger index, ALAsset *asset) { @@ -123,9 +123,7 @@ - (void)openAction:(id)sender return NO; }]; ipc.toolbarItemsForManagingTheSelection = @[selectAll, flexible, selectOdd, flexible, deselectAll]; -// imagePickerController.toolbarItemsForManagingTheSelection = [NSArray array]; - -// imagePickerController.maximumNumberOfPhotos = 3; + [self presentModalViewController:ipc animated:YES]; } diff --git a/AGImagePickerController/AGIPCAlbumsController.m b/AGImagePickerController/AGIPCAlbumsController.m index 8eeb4d6..6bf8004 100644 --- a/AGImagePickerController/AGIPCAlbumsController.m +++ b/AGImagePickerController/AGIPCAlbumsController.m @@ -183,16 +183,37 @@ - (void)loadAssetsGroups return; } - if (weakSelf.imagePickerController.shouldShowSavedPhotosOnTop) { - if ([[group valueForProperty:ALAssetsGroupPropertyType] intValue] == ALAssetsGroupSavedPhotos) { - [self.assetsGroups insertObject:group atIndex:0]; - } else if ([[group valueForProperty:ALAssetsGroupPropertyType] intValue] > ALAssetsGroupSavedPhotos) { - [self.assetsGroups insertObject:group atIndex:1]; - } else { - [self.assetsGroups addObject:group]; - } + /* + if (weakSelf.imagePickerController.shouldShowSavedPhotosOnTop) { + if ([[group valueForProperty:ALAssetsGroupPropertyType] intValue] == ALAssetsGroupSavedPhotos) { + [self.assetsGroups insertObject:group atIndex:0]; + } else if ([[group valueForProperty:ALAssetsGroupPropertyType] intValue] > ALAssetsGroupSavedPhotos) { + [self.assetsGroups insertObject:group atIndex:1]; + } else { + [self.assetsGroups addObject:group]; + } + } else { + [self.assetsGroups addObject:group]; + } + */ + + // optimize the sort algorithm by springox(20140328) + int groupType = [[group valueForProperty:ALAssetsGroupPropertyType] intValue]; + if (weakSelf.imagePickerController.shouldShowSavedPhotosOnTop && groupType == ALAssetsGroupSavedPhotos) { + [self.assetsGroups insertObject:group atIndex:0]; } else { - [self.assetsGroups addObject:group]; + NSUInteger index = 0; + for (ALAssetsGroup *g in [NSArray arrayWithArray:self.assetsGroups]) { + if (weakSelf.imagePickerController.shouldShowSavedPhotosOnTop && [[g valueForProperty:ALAssetsGroupPropertyType] intValue] == ALAssetsGroupSavedPhotos) { + index++; + continue; + } + if (groupType > [[g valueForProperty:ALAssetsGroupPropertyType] intValue]) { + [self.assetsGroups insertObject:group atIndex:index]; + break; + } + index++; + } } dispatch_async(dispatch_get_main_queue(), ^{ diff --git a/AGImagePickerController/AGIPCAssetsController.m b/AGImagePickerController/AGIPCAssetsController.m index 5e74154..34c8b99 100644 --- a/AGImagePickerController/AGIPCAssetsController.m +++ b/AGImagePickerController/AGIPCAssetsController.m @@ -315,8 +315,8 @@ - (void)loadAssets } */ - //[strongSelf.assets addObject:gridItem]; // Descending photos, springox(20131225) + //[strongSelf.assets addObject:gridItem]; [strongSelf.assets insertObject:gridItem atIndex:0]; }]; From a8410b7bd018bfa7139bb7863aafa92fce6e40fb Mon Sep 17 00:00:00 2001 From: SpringOx Date: Thu, 27 Mar 2014 22:50:50 +0800 Subject: [PATCH 04/18] fixed bug for sort of asset group list --- AGImagePickerController/AGIPCAlbumsController.m | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/AGImagePickerController/AGIPCAlbumsController.m b/AGImagePickerController/AGIPCAlbumsController.m index 6bf8004..fb31abd 100644 --- a/AGImagePickerController/AGIPCAlbumsController.m +++ b/AGImagePickerController/AGIPCAlbumsController.m @@ -197,7 +197,7 @@ - (void)loadAssetsGroups } */ - // optimize the sort algorithm by springox(20140328) + // optimize the sort algorithm by springox(20140327) int groupType = [[group valueForProperty:ALAssetsGroupPropertyType] intValue]; if (weakSelf.imagePickerController.shouldShowSavedPhotosOnTop && groupType == ALAssetsGroupSavedPhotos) { [self.assetsGroups insertObject:group atIndex:0]; @@ -214,6 +214,9 @@ - (void)loadAssetsGroups } index++; } + if (![self.assetsGroups containsObject:group]) { + [self.assetsGroups addObject:group]; + } } dispatch_async(dispatch_get_main_queue(), ^{ From e6c2cbb032e4b271f030361d6e82eac3576dc413 Mon Sep 17 00:00:00 2001 From: SpringOx Date: Wed, 23 Apr 2014 00:19:18 +0800 Subject: [PATCH 05/18] repair a big memory leak --- AGImagePickerController/AGIPCAlbumsController.h | 3 ++- AGImagePickerController/AGIPCAlbumsController.m | 2 +- AGImagePickerController/AGIPCAssetsController.h | 3 ++- AGImagePickerController/AGIPCAssetsController.m | 2 +- AGImagePickerController/AGIPCGridCell.h | 3 ++- AGImagePickerController/AGIPCGridCell.m | 2 +- AGImagePickerController/AGIPCGridItem.h | 5 ++--- AGImagePickerController/AGIPCGridItem.m | 2 +- 8 files changed, 12 insertions(+), 10 deletions(-) diff --git a/AGImagePickerController/AGIPCAlbumsController.h b/AGImagePickerController/AGIPCAlbumsController.h index 683f949..2c98f11 100644 --- a/AGImagePickerController/AGIPCAlbumsController.h +++ b/AGImagePickerController/AGIPCAlbumsController.h @@ -16,7 +16,8 @@ @interface AGIPCAlbumsController : UITableViewController -@property (strong) AGImagePickerController *imagePickerController; +// change strong to weak, springox(20140422) +@property (weak) AGImagePickerController *imagePickerController; - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerController; diff --git a/AGImagePickerController/AGIPCAlbumsController.m b/AGImagePickerController/AGIPCAlbumsController.m index fb31abd..6e4c427 100644 --- a/AGImagePickerController/AGIPCAlbumsController.m +++ b/AGImagePickerController/AGIPCAlbumsController.m @@ -17,7 +17,7 @@ @interface AGIPCAlbumsController () { NSMutableArray *_assetsGroups; - AGImagePickerController *_imagePickerController; + __weak AGImagePickerController *_imagePickerController; } @property (ag_weak, nonatomic, readonly) NSMutableArray *assetsGroups; diff --git a/AGImagePickerController/AGIPCAssetsController.h b/AGImagePickerController/AGIPCAssetsController.h index a10129e..e7f690e 100644 --- a/AGImagePickerController/AGIPCAssetsController.h +++ b/AGImagePickerController/AGIPCAssetsController.h @@ -20,7 +20,8 @@ @property (strong) ALAssetsGroup *assetsGroup; @property (ag_weak, readonly) NSArray *selectedAssets; -@property (strong) AGImagePickerController *imagePickerController; +// change strong to weak, springox(20140422) +@property (weak) AGImagePickerController *imagePickerController; - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerController andAssetsGroup:(ALAssetsGroup *)assetsGroup; diff --git a/AGImagePickerController/AGIPCAssetsController.m b/AGImagePickerController/AGIPCAssetsController.m index 34c8b99..5433cec 100644 --- a/AGImagePickerController/AGIPCAssetsController.m +++ b/AGImagePickerController/AGIPCAssetsController.m @@ -20,7 +20,7 @@ @interface AGIPCAssetsController () { ALAssetsGroup *_assetsGroup; NSMutableArray *_assets; - AGImagePickerController *_imagePickerController; + __weak AGImagePickerController *_imagePickerController; } @property (nonatomic, strong) NSMutableArray *assets; diff --git a/AGImagePickerController/AGIPCGridCell.h b/AGImagePickerController/AGIPCGridCell.h index 879e99f..fd83df0 100644 --- a/AGImagePickerController/AGIPCGridCell.h +++ b/AGImagePickerController/AGIPCGridCell.h @@ -16,7 +16,8 @@ @interface AGIPCGridCell : UITableViewCell @property (strong) NSArray *items; -@property (strong) AGImagePickerController *imagePickerController; +// change strong to weak, springox(20140422) +@property (weak) AGImagePickerController *imagePickerController; - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerController items:(NSArray *)items andReuseIdentifier:(NSString *)identifier; diff --git a/AGImagePickerController/AGIPCGridCell.m b/AGImagePickerController/AGIPCGridCell.m index 540523d..e7ef4d7 100644 --- a/AGImagePickerController/AGIPCGridCell.m +++ b/AGImagePickerController/AGIPCGridCell.m @@ -18,7 +18,7 @@ @interface AGIPCGridCell () { NSArray *_items; - AGImagePickerController *_imagePickerController; + __weak AGImagePickerController *_imagePickerController; } @end diff --git a/AGImagePickerController/AGIPCGridItem.h b/AGImagePickerController/AGIPCGridItem.h index ac609ce..3ae76f8 100644 --- a/AGImagePickerController/AGIPCGridItem.h +++ b/AGImagePickerController/AGIPCGridItem.h @@ -32,10 +32,9 @@ @property (assign) BOOL selected; @property (strong) ALAsset *asset; - @property (nonatomic, ag_weak) id delegate; - -@property (strong) AGImagePickerController *imagePickerController; +// change strong to weak, springox(20140422) +@property (weak) AGImagePickerController *imagePickerController; - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerController andAsset:(ALAsset *)asset; - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerController asset:(ALAsset *)asset andDelegate:(id)delegate; diff --git a/AGImagePickerController/AGIPCGridItem.m b/AGImagePickerController/AGIPCGridItem.m index 5ef441d..f6fb140 100644 --- a/AGImagePickerController/AGIPCGridItem.m +++ b/AGImagePickerController/AGIPCGridItem.m @@ -16,7 +16,7 @@ @interface AGIPCGridItem () { - AGImagePickerController *_imagePickerController; + __weak AGImagePickerController *_imagePickerController; ALAsset *_asset; id __ag_weak _delegate; From 43f9b37ce8cc0ed15015dcaa5f3e099aec1b186a Mon Sep 17 00:00:00 2001 From: SpringOx Date: Thu, 24 Apr 2014 07:18:31 +0800 Subject: [PATCH 06/18] optimize the interface for class --- AGImagePickerController/AGIPCAlbumsController.h | 2 ++ AGImagePickerController/AGIPCAlbumsController.m | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/AGImagePickerController/AGIPCAlbumsController.h b/AGImagePickerController/AGIPCAlbumsController.h index 2c98f11..3379f69 100644 --- a/AGImagePickerController/AGIPCAlbumsController.h +++ b/AGImagePickerController/AGIPCAlbumsController.h @@ -21,4 +21,6 @@ - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerController; +- (void)loadAssetsGroups; + @end diff --git a/AGImagePickerController/AGIPCAlbumsController.m b/AGImagePickerController/AGIPCAlbumsController.m index 6e4c427..b0728a6 100644 --- a/AGImagePickerController/AGIPCAlbumsController.m +++ b/AGImagePickerController/AGIPCAlbumsController.m @@ -31,7 +31,6 @@ - (void)unregisterFromNotifications; - (void)didChangeLibrary:(NSNotification *)notification; -- (void)loadAssetsGroups; - (void)reloadData; - (void)cancelAction:(id)sender; @@ -49,7 +48,6 @@ - (NSMutableArray *)assetsGroups if (_assetsGroups == nil) { _assetsGroups = [[NSMutableArray alloc] init]; - [self loadAssetsGroups]; } return _assetsGroups; @@ -63,6 +61,10 @@ - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerContro if (self) { self.imagePickerController = imagePickerController; + + [self assetsGroups]; + + [self loadAssetsGroups]; } return self; From dc8863bdc262e0d612c46c10abca48c7e0b836cb Mon Sep 17 00:00:00 2001 From: SpringOx Date: Sat, 3 May 2014 00:24:46 +0800 Subject: [PATCH 07/18] optimize the subviews memory mgr --- .../AGIPCAlbumsController.m | 10 +++++----- .../AGIPCAssetsController.m | 18 ++++++++++++++---- AGImagePickerController/AGIPCGridCell.m | 12 ++++++++++-- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/AGImagePickerController/AGIPCAlbumsController.m b/AGImagePickerController/AGIPCAlbumsController.m index b0728a6..f4b5b95 100644 --- a/AGImagePickerController/AGIPCAlbumsController.m +++ b/AGImagePickerController/AGIPCAlbumsController.m @@ -96,6 +96,8 @@ - (void)viewDidLoad self.wantsFullScreenLayout = YES; } + self.title = NSLocalizedStringWithDefaultValue(@"AGIPC.Albums", nil, [NSBundle mainBundle], @"Albums", nil); + // Setup Notifications [self registerForNotifications]; @@ -147,7 +149,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N cell.detailTextLabel.text = [NSString stringWithFormat:@"%d", numberOfAssets]; [cell.imageView setImage:[UIImage imageWithCGImage:[(ALAssetsGroup *)self.assetsGroups[indexPath.row] posterImage]]]; [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; - + return cell; } @@ -180,7 +182,8 @@ - (void)loadAssetsGroups void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) { - if (group == nil) + // filter the value==0, springox(20140502) + if (group == nil || group.numberOfAssets == 0) { return; } @@ -243,9 +246,6 @@ - (void)loadAssetsGroups - (void)reloadData { [self.tableView reloadData]; - // Modified by springox(20140306) - //self.title = NSLocalizedStringWithDefaultValue(@"AGIPC.Albums", nil, [NSBundle mainBundle], @"Albums", nil); - self.title = NSLocalizedString(@"Albums", @"text"); } - (void)cancelAction:(id)sender diff --git a/AGImagePickerController/AGIPCAssetsController.m b/AGImagePickerController/AGIPCAssetsController.m index 5433cec..234a826 100644 --- a/AGImagePickerController/AGIPCAssetsController.m +++ b/AGImagePickerController/AGIPCAssetsController.m @@ -183,6 +183,17 @@ - (NSArray *)itemsForRowAtIndexPath:(NSIndexPath *)indexPath return items; } +- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section +{ + return self.imagePickerController.itemRect.origin.y; +} + +- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section +{ + UIView *view = [[UIView alloc] init]; + return view; +} + - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; @@ -316,8 +327,8 @@ - (void)loadAssets */ // Descending photos, springox(20131225) - //[strongSelf.assets addObject:gridItem]; - [strongSelf.assets insertObject:gridItem atIndex:0]; + [strongSelf.assets addObject:gridItem]; + //[strongSelf.assets insertObject:gridItem atIndex:0]; }]; } @@ -341,13 +352,12 @@ - (void)reloadData //[self setTitle:[self.assetsGroup valueForProperty:ALAssetsGroupPropertyName]]; [self changeSelectionInformation]; - /* + NSInteger totalRows = [self.tableView numberOfRowsInSection:0]; //Prevents crash if totalRows = 0 (when the album is empty). if (totalRows > 0) { [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:totalRows-1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:NO]; } - */ } - (void)doneAction:(id)sender diff --git a/AGImagePickerController/AGIPCGridCell.m b/AGImagePickerController/AGIPCGridCell.m index e7ef4d7..06ebcc7 100644 --- a/AGImagePickerController/AGIPCGridCell.m +++ b/AGImagePickerController/AGIPCGridCell.m @@ -35,16 +35,20 @@ - (void)setItems:(NSArray *)items { if (_items != items) { - _items = items; + for (AGIPCGridItem *gridItem in items) { + [gridItem removeFromSuperview]; + } for (UIView *view in [self.contentView subviews]) { [view removeFromSuperview]; } + _items = items; + for (AGIPCGridItem *gridItem in _items) { - [self addSubview:gridItem]; + [self.contentView addSubview:gridItem]; } } } @@ -98,6 +102,10 @@ - (void)layoutSubviews frame.origin.x = frame.origin.x + frame.size.width + leftMargin; } + + CGRect rect = self.contentView.frame; + rect.size.height = frame.origin.x + frame.size.height; + self.contentView.frame = rect; } @end From 40a9c6b4b4950902166524b50f926227de7bae85 Mon Sep 17 00:00:00 2001 From: SpringOx Date: Sat, 3 May 2014 23:39:58 +0800 Subject: [PATCH 08/18] =?UTF-8?q?1=E3=80=81support=20the=20picker=20preloa?= =?UTF-8?q?d=202=E3=80=81picker=20instance=20support=20user=20is=20denied?= =?UTF-8?q?=20flag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AGIPCAlbumsController.h | 5 +- .../AGIPCAlbumsController.m | 11 ++- .../AGIPCAssetsController.h | 2 +- AGImagePickerController/AGIPCGridCell.h | 2 +- AGImagePickerController/AGIPCGridItem.h | 2 +- .../AGImagePickerController.h | 6 ++ .../AGImagePickerController.m | 76 +++++++++++++++---- 7 files changed, 83 insertions(+), 21 deletions(-) diff --git a/AGImagePickerController/AGIPCAlbumsController.h b/AGImagePickerController/AGIPCAlbumsController.h index 3379f69..1859dac 100644 --- a/AGImagePickerController/AGIPCAlbumsController.h +++ b/AGImagePickerController/AGIPCAlbumsController.h @@ -16,11 +16,12 @@ @interface AGIPCAlbumsController : UITableViewController +@property (ag_weak, nonatomic, readonly) NSMutableArray *assetsGroups; // change strong to weak, springox(20140422) -@property (weak) AGImagePickerController *imagePickerController; +@property (ag_weak) AGImagePickerController *imagePickerController; - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerController; -- (void)loadAssetsGroups; +- (void)pushFirstAssetsController; @end diff --git a/AGImagePickerController/AGIPCAlbumsController.m b/AGImagePickerController/AGIPCAlbumsController.m index f4b5b95..af56e74 100644 --- a/AGImagePickerController/AGIPCAlbumsController.m +++ b/AGImagePickerController/AGIPCAlbumsController.m @@ -20,8 +20,6 @@ @interface AGIPCAlbumsController () __weak AGImagePickerController *_imagePickerController; } -@property (ag_weak, nonatomic, readonly) NSMutableArray *assetsGroups; - @end @interface AGIPCAlbumsController () @@ -124,6 +122,15 @@ - (NSUInteger)supportedInterfaceOrientations return UIInterfaceOrientationMaskAll; } +- (void)pushFirstAssetsController +{ + [self.navigationController popToRootViewControllerAnimated:NO]; + if (0 < self.assetsGroups.count) { + AGIPCAssetsController *controller = [[AGIPCAssetsController alloc] initWithImagePickerController:self.imagePickerController andAssetsGroup:self.assetsGroups[0]]; + [self.navigationController pushViewController:controller animated:NO]; + } +} + #pragma mark - UITableViewDataSource Methods - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section diff --git a/AGImagePickerController/AGIPCAssetsController.h b/AGImagePickerController/AGIPCAssetsController.h index e7f690e..72c591b 100644 --- a/AGImagePickerController/AGIPCAssetsController.h +++ b/AGImagePickerController/AGIPCAssetsController.h @@ -21,7 +21,7 @@ @property (strong) ALAssetsGroup *assetsGroup; @property (ag_weak, readonly) NSArray *selectedAssets; // change strong to weak, springox(20140422) -@property (weak) AGImagePickerController *imagePickerController; +@property (ag_weak) AGImagePickerController *imagePickerController; - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerController andAssetsGroup:(ALAssetsGroup *)assetsGroup; diff --git a/AGImagePickerController/AGIPCGridCell.h b/AGImagePickerController/AGIPCGridCell.h index fd83df0..0094901 100644 --- a/AGImagePickerController/AGIPCGridCell.h +++ b/AGImagePickerController/AGIPCGridCell.h @@ -17,7 +17,7 @@ @property (strong) NSArray *items; // change strong to weak, springox(20140422) -@property (weak) AGImagePickerController *imagePickerController; +@property (ag_weak) AGImagePickerController *imagePickerController; - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerController items:(NSArray *)items andReuseIdentifier:(NSString *)identifier; diff --git a/AGImagePickerController/AGIPCGridItem.h b/AGImagePickerController/AGIPCGridItem.h index 3ae76f8..e37d317 100644 --- a/AGImagePickerController/AGIPCGridItem.h +++ b/AGImagePickerController/AGIPCGridItem.h @@ -34,7 +34,7 @@ @property (strong) ALAsset *asset; @property (nonatomic, ag_weak) id delegate; // change strong to weak, springox(20140422) -@property (weak) AGImagePickerController *imagePickerController; +@property (ag_weak) AGImagePickerController *imagePickerController; - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerController andAsset:(ALAsset *)asset; - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerController asset:(ALAsset *)asset andDelegate:(id)delegate; diff --git a/AGImagePickerController/AGImagePickerController.h b/AGImagePickerController/AGImagePickerController.h index 3dad647..92e87d0 100644 --- a/AGImagePickerController/AGImagePickerController.h +++ b/AGImagePickerController/AGImagePickerController.h @@ -81,8 +81,12 @@ shouldShowToolbarForManagingTheSelectionInSelectionMode:(AGImagePickerController @property (nonatomic, readonly) AGImagePickerControllerSelectionMode selectionMode; +@property (nonatomic, assign) BOOL userIsDenied; + + (ALAssetsLibrary *)defaultAssetsLibrary; ++ (AGImagePickerController *)sharedInstance:(id)delegate; + - (id)initWithDelegate:(id)delegate; - (id)initWithFailureBlock:(AGIPCDidFail)failureBlock andSuccessBlock:(AGIPCDidFinish)successBlock; @@ -94,6 +98,8 @@ shouldChangeStatusBarStyle:(BOOL)shouldChangeStatusBarStyle toolbarItemsForManagingTheSelection:(NSArray *)toolbarItemsForManagingTheSelection andShouldShowSavedPhotosOnTop:(BOOL)shouldShowSavedPhotosOnTop; +- (void)showFirstAssetsController; + @end diff --git a/AGImagePickerController/AGImagePickerController.m b/AGImagePickerController/AGImagePickerController.m index 7183ea1..cb24cda 100644 --- a/AGImagePickerController/AGImagePickerController.m +++ b/AGImagePickerController/AGImagePickerController.m @@ -14,6 +14,8 @@ #import "AGIPCAlbumsController.h" #import "AGIPCGridItem.h" +static AGImagePickerController *_sharedInstance = nil; + @interface AGImagePickerController () { @@ -27,6 +29,52 @@ - (void)didFail:(NSError *)error; @implementation AGImagePickerController ++ (ALAssetsLibrary *)defaultAssetsLibrary +{ + static ALAssetsLibrary *assetsLibrary = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + assetsLibrary = [[ALAssetsLibrary alloc] init]; + + // Workaround for triggering ALAssetsLibraryChangedNotification + [assetsLibrary writeImageToSavedPhotosAlbum:nil metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) { }]; + }); + + return assetsLibrary; +} + ++ (AGImagePickerController *)sharedInstance:(id)delegate +{ + if (nil == _sharedInstance){ + @synchronized(self) { + if (nil == _sharedInstance){ + _sharedInstance = [AGImagePickerController imagePickerWithDelegate:nil]; + } + } + } + _sharedInstance.delegate = delegate; + return _sharedInstance; +} + ++ (AGImagePickerController *)imagePickerWithDelegate:(id)delegate +{ + AGImagePickerController *picker = [[AGImagePickerController alloc] initWithDelegate:delegate]; + + // Show saved photos on top + picker.shouldShowSavedPhotosOnTop = YES; + picker.shouldChangeStatusBarStyle = YES; + NSString *maxStr = [ANConfig getConfigParams:kMaximumNumberOfPhotosToBeSelected]; + if (0 < [maxStr length]) { + picker.maximumNumberOfPhotosToBeSelected = [maxStr integerValue]; + } else { + picker.maximumNumberOfPhotosToBeSelected = 5; + } + picker.toolbarItemsForManagingTheSelection = @[]; + picker.viewControllers = @[[[AGIPCAlbumsController alloc] initWithImagePickerController:picker]]; + + return picker; +} + #pragma mark - Properties @synthesize @@ -76,20 +124,6 @@ - (void)setShouldChangeStatusBarStyle:(BOOL)shouldChangeStatusBarStyle } } -+ (ALAssetsLibrary *)defaultAssetsLibrary -{ - static ALAssetsLibrary *assetsLibrary = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - assetsLibrary = [[ALAssetsLibrary alloc] init]; - - // Workaround for triggering ALAssetsLibraryChangedNotification - [assetsLibrary writeImageToSavedPhotosAlbum:nil metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) { }]; - }); - - return assetsLibrary; -} - #pragma mark - Object Lifecycle - (id)init @@ -149,6 +183,14 @@ - (id)initWithDelegate:(id)delegate return self; } +- (void)showFirstAssetsController +{ + AGIPCAlbumsController *albumsCtl = (AGIPCAlbumsController *)[self.viewControllers firstObject]; + if ([albumsCtl respondsToSelector:@selector(pushFirstAssetsController)]) { + [albumsCtl pushFirstAssetsController]; + } +} + #pragma mark - View lifecycle - (NSUInteger)supportedInterfaceOrientations @@ -162,6 +204,8 @@ - (void)didFinishPickingAssets:(NSArray *)selectedAssets { [self popToRootViewControllerAnimated:NO]; + self.userIsDenied = NO; + // Reset the number of selections [AGIPCGridItem performSelector:@selector(resetNumberOfSelections)]; @@ -192,6 +236,10 @@ - (void)didCancelPickingAssets - (void)didFail:(NSError *)error { + if (nil != error) { + self.userIsDenied = YES; + } + [self popToRootViewControllerAnimated:NO]; // Reset the number of selections From 9dfe7855a50c5d527cffd0cbbc29dff10c01cdb3 Mon Sep 17 00:00:00 2001 From: SpringOx Date: Sat, 3 May 2014 23:47:31 +0800 Subject: [PATCH 09/18] =?UTF-8?q?1=E3=80=81support=20the=20picker=20preloa?= =?UTF-8?q?d=202=E3=80=81picker=20instance=20support=20user=20is=20denied?= =?UTF-8?q?=20flag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGImagePickerController/AGIPCAlbumsController.m | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/AGImagePickerController/AGIPCAlbumsController.m b/AGImagePickerController/AGIPCAlbumsController.m index af56e74..5877c40 100644 --- a/AGImagePickerController/AGIPCAlbumsController.m +++ b/AGImagePickerController/AGIPCAlbumsController.m @@ -128,6 +128,12 @@ - (void)pushFirstAssetsController if (0 < self.assetsGroups.count) { AGIPCAssetsController *controller = [[AGIPCAssetsController alloc] initWithImagePickerController:self.imagePickerController andAssetsGroup:self.assetsGroups[0]]; [self.navigationController pushViewController:controller animated:NO]; + } else { + static int tryCount; + if (tryCount < 3) { + [self performSelector:@selector(pushFirstAssetsController) withObject:nil afterDelay:0.8]; + ++tryCount; + } } } From df5b8a0d37929474dbfff91c41b7efb0f726bdcf Mon Sep 17 00:00:00 2001 From: SpringOx Date: Sat, 3 May 2014 23:56:20 +0800 Subject: [PATCH 10/18] =?UTF-8?q?1=E3=80=81support=20the=20picker=20preloa?= =?UTF-8?q?d=202=E3=80=81picker=20instance=20support=20user=20is=20denied?= =?UTF-8?q?=20flag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AGIPCAlbumsController.m | 53 ++++++++++--------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/AGImagePickerController/AGIPCAlbumsController.m b/AGImagePickerController/AGIPCAlbumsController.m index 5877c40..46278cd 100644 --- a/AGImagePickerController/AGIPCAlbumsController.m +++ b/AGImagePickerController/AGIPCAlbumsController.m @@ -125,14 +125,17 @@ - (NSUInteger)supportedInterfaceOrientations - (void)pushFirstAssetsController { [self.navigationController popToRootViewControllerAnimated:NO]; - if (0 < self.assetsGroups.count) { - AGIPCAssetsController *controller = [[AGIPCAssetsController alloc] initWithImagePickerController:self.imagePickerController andAssetsGroup:self.assetsGroups[0]]; - [self.navigationController pushViewController:controller animated:NO]; - } else { - static int tryCount; - if (tryCount < 3) { - [self performSelector:@selector(pushFirstAssetsController) withObject:nil afterDelay:0.8]; - ++tryCount; + + @synchronized(self) { + if (0 < self.assetsGroups.count) { + AGIPCAssetsController *controller = [[AGIPCAssetsController alloc] initWithImagePickerController:self.imagePickerController andAssetsGroup:self.assetsGroups[0]]; + [self.navigationController pushViewController:controller animated:NO]; + } else { + static int tryCount; + if (tryCount < 3) { + [self performSelector:@selector(pushFirstAssetsController) withObject:nil afterDelay:0.8]; + ++tryCount; + } } } } @@ -215,25 +218,27 @@ - (void)loadAssetsGroups } */ - // optimize the sort algorithm by springox(20140327) - int groupType = [[group valueForProperty:ALAssetsGroupPropertyType] intValue]; - if (weakSelf.imagePickerController.shouldShowSavedPhotosOnTop && groupType == ALAssetsGroupSavedPhotos) { - [self.assetsGroups insertObject:group atIndex:0]; - } else { - NSUInteger index = 0; - for (ALAssetsGroup *g in [NSArray arrayWithArray:self.assetsGroups]) { - if (weakSelf.imagePickerController.shouldShowSavedPhotosOnTop && [[g valueForProperty:ALAssetsGroupPropertyType] intValue] == ALAssetsGroupSavedPhotos) { + @synchronized(weakSelf) { + // optimize the sort algorithm by springox(20140327) + int groupType = [[group valueForProperty:ALAssetsGroupPropertyType] intValue]; + if (weakSelf.imagePickerController.shouldShowSavedPhotosOnTop && groupType == ALAssetsGroupSavedPhotos) { + [self.assetsGroups insertObject:group atIndex:0]; + } else { + NSUInteger index = 0; + for (ALAssetsGroup *g in [NSArray arrayWithArray:self.assetsGroups]) { + if (weakSelf.imagePickerController.shouldShowSavedPhotosOnTop && [[g valueForProperty:ALAssetsGroupPropertyType] intValue] == ALAssetsGroupSavedPhotos) { + index++; + continue; + } + if (groupType > [[g valueForProperty:ALAssetsGroupPropertyType] intValue]) { + [self.assetsGroups insertObject:group atIndex:index]; + break; + } index++; - continue; } - if (groupType > [[g valueForProperty:ALAssetsGroupPropertyType] intValue]) { - [self.assetsGroups insertObject:group atIndex:index]; - break; + if (![self.assetsGroups containsObject:group]) { + [self.assetsGroups addObject:group]; } - index++; - } - if (![self.assetsGroups containsObject:group]) { - [self.assetsGroups addObject:group]; } } From 759d26e3da6a0e64cd4eb476856bc7bbdf656467 Mon Sep 17 00:00:00 2001 From: SpringOx Date: Sun, 4 May 2014 00:07:52 +0800 Subject: [PATCH 11/18] =?UTF-8?q?1=E3=80=81support=20the=20picker=20preloa?= =?UTF-8?q?d=202=E3=80=81picker=20instance=20support=20user=20is=20denied?= =?UTF-8?q?=20flag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGImagePickerController Demo/AGViewController.m | 11 ++++++++--- AGImagePickerController/AGIPCAlbumsController.m | 2 +- AGImagePickerController/AGIPCAssetsController.m | 2 +- AGImagePickerController/AGIPCGridCell.m | 2 +- AGImagePickerController/AGIPCGridItem.m | 2 +- AGImagePickerController/AGImagePickerController.m | 7 +------ 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/AGImagePickerController Demo/AGViewController.m b/AGImagePickerController Demo/AGViewController.m index dabbc3b..7528114 100644 --- a/AGImagePickerController Demo/AGViewController.m +++ b/AGImagePickerController Demo/AGViewController.m @@ -35,7 +35,10 @@ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil __block AGViewController *blockSelf = self; - ipc = [[AGImagePickerController alloc] initWithDelegate:self]; + //ipc = [[AGImagePickerController alloc] initWithDelegate:self]; + // modified by springox(20140503) + ipc = [AGImagePickerController sharedInstance:self]; + ipc.didFailBlock = ^(NSError *error) { NSLog(@"Fail. Error: %@", error); @@ -66,7 +69,6 @@ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES]; }; } - return self; } @@ -109,7 +111,7 @@ - (void)openAction:(id)sender ipc.shouldShowSavedPhotosOnTop = NO; ipc.shouldChangeStatusBarStyle = YES; ipc.selection = self.selectedPhotos; - //ipc.maximumNumberOfPhotosToBeSelected = 10; + ipc.maximumNumberOfPhotosToBeSelected = 10; // Custom toolbar items AGIPCToolbarItem *selectAll = [[AGIPCToolbarItem alloc] initWithBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"+ Select All" style:UIBarButtonItemStyleBordered target:nil action:nil] andSelectionBlock:^BOOL(NSUInteger index, ALAsset *asset) { @@ -125,6 +127,9 @@ - (void)openAction:(id)sender ipc.toolbarItemsForManagingTheSelection = @[selectAll, flexible, selectOdd, flexible, deselectAll]; [self presentModalViewController:ipc animated:YES]; + + // modified by springox(20140503) + [ipc showFirstAssetsController]; } #pragma mark - AGImagePickerControllerDelegate methods diff --git a/AGImagePickerController/AGIPCAlbumsController.m b/AGImagePickerController/AGIPCAlbumsController.m index 46278cd..173b6b1 100644 --- a/AGImagePickerController/AGIPCAlbumsController.m +++ b/AGImagePickerController/AGIPCAlbumsController.m @@ -17,7 +17,7 @@ @interface AGIPCAlbumsController () { NSMutableArray *_assetsGroups; - __weak AGImagePickerController *_imagePickerController; + __ag_weak AGImagePickerController *_imagePickerController; } @end diff --git a/AGImagePickerController/AGIPCAssetsController.m b/AGImagePickerController/AGIPCAssetsController.m index 234a826..e009f79 100644 --- a/AGImagePickerController/AGIPCAssetsController.m +++ b/AGImagePickerController/AGIPCAssetsController.m @@ -20,7 +20,7 @@ @interface AGIPCAssetsController () { ALAssetsGroup *_assetsGroup; NSMutableArray *_assets; - __weak AGImagePickerController *_imagePickerController; + __ag_weak AGImagePickerController *_imagePickerController; } @property (nonatomic, strong) NSMutableArray *assets; diff --git a/AGImagePickerController/AGIPCGridCell.m b/AGImagePickerController/AGIPCGridCell.m index 06ebcc7..ecd15f7 100644 --- a/AGImagePickerController/AGIPCGridCell.m +++ b/AGImagePickerController/AGIPCGridCell.m @@ -18,7 +18,7 @@ @interface AGIPCGridCell () { NSArray *_items; - __weak AGImagePickerController *_imagePickerController; + __ag_weak AGImagePickerController *_imagePickerController; } @end diff --git a/AGImagePickerController/AGIPCGridItem.m b/AGImagePickerController/AGIPCGridItem.m index f6fb140..d1425f6 100644 --- a/AGImagePickerController/AGIPCGridItem.m +++ b/AGImagePickerController/AGIPCGridItem.m @@ -16,7 +16,7 @@ @interface AGIPCGridItem () { - __weak AGImagePickerController *_imagePickerController; + __ag_weak AGImagePickerController *_imagePickerController; ALAsset *_asset; id __ag_weak _delegate; diff --git a/AGImagePickerController/AGImagePickerController.m b/AGImagePickerController/AGImagePickerController.m index cb24cda..735a836 100644 --- a/AGImagePickerController/AGImagePickerController.m +++ b/AGImagePickerController/AGImagePickerController.m @@ -63,12 +63,7 @@ + (AGImagePickerController *)imagePickerWithDelegate:(id Date: Mon, 5 May 2014 00:13:03 +0800 Subject: [PATCH 12/18] =?UTF-8?q?1=E3=80=81support=20the=20picker=20preloa?= =?UTF-8?q?d=202=E3=80=81picker=20instance=20support=20user=20is=20denied?= =?UTF-8?q?=20flag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGImagePickerController/AGImagePickerController.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AGImagePickerController/AGImagePickerController.m b/AGImagePickerController/AGImagePickerController.m index 735a836..d5ba4e6 100644 --- a/AGImagePickerController/AGImagePickerController.m +++ b/AGImagePickerController/AGImagePickerController.m @@ -197,7 +197,7 @@ - (NSUInteger)supportedInterfaceOrientations - (void)didFinishPickingAssets:(NSArray *)selectedAssets { - [self popToRootViewControllerAnimated:NO]; + //[self popToRootViewControllerAnimated:NO]; self.userIsDenied = NO; @@ -215,7 +215,7 @@ - (void)didFinishPickingAssets:(NSArray *)selectedAssets - (void)didCancelPickingAssets { - [self popToRootViewControllerAnimated:NO]; + //[self popToRootViewControllerAnimated:NO]; // Reset the number of selections [AGIPCGridItem performSelector:@selector(resetNumberOfSelections)]; From 2c0d39454c72f6f51ab5da4fc09392b00082a3a9 Mon Sep 17 00:00:00 2001 From: SpringOx Date: Sun, 11 May 2014 14:36:20 +0800 Subject: [PATCH 13/18] opitimize init method --- .../AGIPCAssetsController.m | 19 ++++++++++++------- .../AGImagePickerController.m | 3 +-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/AGImagePickerController/AGIPCAssetsController.m b/AGImagePickerController/AGIPCAssetsController.m index e009f79..12d6fde 100644 --- a/AGImagePickerController/AGIPCAssetsController.m +++ b/AGImagePickerController/AGIPCAssetsController.m @@ -82,7 +82,8 @@ - (void)setAssetsGroup:(ALAssetsGroup *)theAssetsGroup _assetsGroup = theAssetsGroup; [_assetsGroup setAssetsFilter:[ALAssetsFilter allPhotos]]; - [self reloadData]; + // modified by springox(20140510) + //[self reloadData]; } } } @@ -191,9 +192,16 @@ - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSIntege - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { UIView *view = [[UIView alloc] init]; + view.backgroundColor = [UIColor whiteColor]; return view; } +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath +{ + CGRect itemRect = self.imagePickerController.itemRect; + return itemRect.size.height + itemRect.origin.y; +} + - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; @@ -211,12 +219,6 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N return cell; } -- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath -{ - CGRect itemRect = self.imagePickerController.itemRect; - return itemRect.size.height + itemRect.origin.y; -} - #pragma mark - View Lifecycle - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation @@ -248,6 +250,9 @@ - (void)viewDidLoad self.wantsFullScreenLayout = YES; } + // modified by springox(20140510) + [self reloadData]; + // Setup Notifications [self registerForNotifications]; } diff --git a/AGImagePickerController/AGImagePickerController.m b/AGImagePickerController/AGImagePickerController.m index d5ba4e6..3fbf6e7 100644 --- a/AGImagePickerController/AGImagePickerController.m +++ b/AGImagePickerController/AGImagePickerController.m @@ -65,8 +65,7 @@ + (AGImagePickerController *)imagePickerWithDelegate:(id Date: Tue, 10 Jun 2014 10:28:58 +0800 Subject: [PATCH 14/18] change check mark to iOS 7 style --- .../project.pbxproj | 8 +- .../AGImagePickerController Demo.xccheckout | 41 +++++++++ .../UserInterfaceState.xcuserstate | Bin 0 -> 19854 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 + .../AGImagePickerController Demo.xcscheme | 86 ++++++++++++++++++ .../xcschemes/xcschememanagement.plist | 22 +++++ .../AGViewController.m | 31 ++++--- .../AGIPC-Checkmark-iPad.png | Bin 2358 -> 889 bytes .../AGIPC-Checkmark-iPhone.png | Bin 2358 -> 889 bytes .../AGIPC-Checkmark-iPhone@2x.png | Bin 4475 -> 1341 bytes 10 files changed, 174 insertions(+), 19 deletions(-) create mode 100644 AGImagePickerController Demo.xcodeproj/project.xcworkspace/xcshareddata/AGImagePickerController Demo.xccheckout create mode 100644 AGImagePickerController Demo.xcodeproj/project.xcworkspace/xcuserdata/xummer.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 AGImagePickerController Demo.xcodeproj/xcuserdata/xummer.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 AGImagePickerController Demo.xcodeproj/xcuserdata/xummer.xcuserdatad/xcschemes/AGImagePickerController Demo.xcscheme create mode 100644 AGImagePickerController Demo.xcodeproj/xcuserdata/xummer.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/AGImagePickerController Demo.xcodeproj/project.pbxproj b/AGImagePickerController Demo.xcodeproj/project.pbxproj index 9cf6c7d..b150683 100644 --- a/AGImagePickerController Demo.xcodeproj/project.pbxproj +++ b/AGImagePickerController Demo.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 54A1E5551882A31E00D556FD /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54A1E5541882A31E00D556FD /* CoreLocation.framework */; }; + C1F27BD91946A34000614393 /* AGImagePickerController.bundle in Resources */ = {isa = PBXBuildFile; fileRef = C1F27BD81946A34000614393 /* AGImagePickerController.bundle */; }; FE1E332914ED167800F6A6A2 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FE1E332814ED167800F6A6A2 /* UIKit.framework */; }; FE1E332B14ED167800F6A6A2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FE1E332A14ED167800F6A6A2 /* Foundation.framework */; }; FE1E333314ED167800F6A6A2 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = FE1E333114ED167800F6A6A2 /* InfoPlist.strings */; }; @@ -27,7 +28,6 @@ FECDC90114EDB9C30038006D /* AGIPCGridCell.m in Sources */ = {isa = PBXBuildFile; fileRef = FECDC90014EDB9C30038006D /* AGIPCGridCell.m */; }; FECDC90514EDBB690038006D /* AGIPCGridItem.m in Sources */ = {isa = PBXBuildFile; fileRef = FECDC90414EDBB690038006D /* AGIPCGridItem.m */; }; FEDAA95516C2F3D600234FF0 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEA599E114ED30140057FF9C /* AssetsLibrary.framework */; }; - FEDAA95716C3089600234FF0 /* AGImagePickerController.bundle in Resources */ = {isa = PBXBuildFile; fileRef = FEDAA95616C3089600234FF0 /* AGImagePickerController.bundle */; }; FEE0F35D16C509EF001A077B /* AGImagePickerController.podspec in Resources */ = {isa = PBXBuildFile; fileRef = FEE0F35C16C509EF001A077B /* AGImagePickerController.podspec */; }; FEF247F2150DF461008FEFAD /* AGImagePickerController-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = FEF247F1150DF461008FEFAD /* AGImagePickerController-icon.png */; }; FEF247F5150DF463008FEFAD /* AGImagePickerController-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FEF247F4150DF463008FEFAD /* AGImagePickerController-icon@2x.png */; }; @@ -35,6 +35,7 @@ /* Begin PBXFileReference section */ 54A1E5541882A31E00D556FD /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; + C1F27BD81946A34000614393 /* AGImagePickerController.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = AGImagePickerController.bundle; sourceTree = ""; }; FE1E332414ED167800F6A6A2 /* AGImagePickerController Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "AGImagePickerController Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; FE1E332814ED167800F6A6A2 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; FE1E332A14ED167800F6A6A2 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -69,7 +70,6 @@ FECDC90014EDB9C30038006D /* AGIPCGridCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AGIPCGridCell.m; sourceTree = ""; }; FECDC90314EDBB690038006D /* AGIPCGridItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AGIPCGridItem.h; sourceTree = ""; }; FECDC90414EDBB690038006D /* AGIPCGridItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AGIPCGridItem.m; sourceTree = ""; }; - FEDAA95616C3089600234FF0 /* AGImagePickerController.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = AGImagePickerController.bundle; sourceTree = ""; }; FEE0F35C16C509EF001A077B /* AGImagePickerController.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AGImagePickerController.podspec; sourceTree = ""; }; FEF247F1150DF461008FEFAD /* AGImagePickerController-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "AGImagePickerController-icon.png"; path = "../AGImagePickerController-icon.png"; sourceTree = ""; }; FEF247F4150DF463008FEFAD /* AGImagePickerController-icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "AGImagePickerController-icon@2x.png"; path = "../AGImagePickerController-icon@2x.png"; sourceTree = ""; }; @@ -155,7 +155,7 @@ children = ( FE4DE10216C267400075E499 /* AGImagePickerController+Helper.h */, FE4DE10316C267410075E499 /* AGImagePickerController+Helper.m */, - FEDAA95616C3089600234FF0 /* AGImagePickerController.bundle */, + C1F27BD81946A34000614393 /* AGImagePickerController.bundle */, FEA599C914ED1C500057FF9C /* AGImagePickerController.h */, FEA599CA14ED1C500057FF9C /* AGImagePickerController.m */, FE6E796014FCDC8A006612F0 /* AGImagePickerControllerDefines.h */, @@ -230,10 +230,10 @@ FE1E333F14ED167800F6A6A2 /* AGViewController_iPhone.xib in Resources */, FE1E334214ED167800F6A6A2 /* AGViewController_iPad.xib in Resources */, FE3850CB1501B8A10053C9DD /* README.md in Resources */, + C1F27BD91946A34000614393 /* AGImagePickerController.bundle in Resources */, FEF247F2150DF461008FEFAD /* AGImagePickerController-icon.png in Resources */, FEF247F5150DF463008FEFAD /* AGImagePickerController-icon@2x.png in Resources */, FE4DE10116C2546B0075E499 /* Default-568h@2x.png in Resources */, - FEDAA95716C3089600234FF0 /* AGImagePickerController.bundle in Resources */, FEE0F35D16C509EF001A077B /* AGImagePickerController.podspec in Resources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/AGImagePickerController Demo.xcodeproj/project.xcworkspace/xcshareddata/AGImagePickerController Demo.xccheckout b/AGImagePickerController Demo.xcodeproj/project.xcworkspace/xcshareddata/AGImagePickerController Demo.xccheckout new file mode 100644 index 0000000..18dff82 --- /dev/null +++ b/AGImagePickerController Demo.xcodeproj/project.xcworkspace/xcshareddata/AGImagePickerController Demo.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 78F5169C-438B-4683-911B-0A793A9CE480 + IDESourceControlProjectName + AGImagePickerController Demo + IDESourceControlProjectOriginsDictionary + + 4EB08CCB-4EE8-46E7-9CA7-663BC809B225 + ssh://github.com/Xummer/AGImagePickerController.git + + IDESourceControlProjectPath + AGImagePickerController Demo.xcodeproj/project.xcworkspace + IDESourceControlProjectRelativeInstallPathDictionary + + 4EB08CCB-4EE8-46E7-9CA7-663BC809B225 + ../.. + + IDESourceControlProjectURL + ssh://github.com/Xummer/AGImagePickerController.git + IDESourceControlProjectVersion + 110 + IDESourceControlProjectWCCIdentifier + 4EB08CCB-4EE8-46E7-9CA7-663BC809B225 + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 4EB08CCB-4EE8-46E7-9CA7-663BC809B225 + IDESourceControlWCCName + AGImagePickerController + + + + diff --git a/AGImagePickerController Demo.xcodeproj/project.xcworkspace/xcuserdata/xummer.xcuserdatad/UserInterfaceState.xcuserstate b/AGImagePickerController Demo.xcodeproj/project.xcworkspace/xcuserdata/xummer.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..f10f0c0c046335436625c2c22875859161f2d22e GIT binary patch literal 19854 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

?M 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 literal 0 HcmV?d00001 diff --git a/AGImagePickerController Demo.xcodeproj/xcuserdata/xummer.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/AGImagePickerController Demo.xcodeproj/xcuserdata/xummer.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..fe2b454 --- /dev/null +++ b/AGImagePickerController Demo.xcodeproj/xcuserdata/xummer.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/AGImagePickerController Demo.xcodeproj/xcuserdata/xummer.xcuserdatad/xcschemes/AGImagePickerController Demo.xcscheme b/AGImagePickerController Demo.xcodeproj/xcuserdata/xummer.xcuserdatad/xcschemes/AGImagePickerController Demo.xcscheme new file mode 100644 index 0000000..3011610 --- /dev/null +++ b/AGImagePickerController Demo.xcodeproj/xcuserdata/xummer.xcuserdatad/xcschemes/AGImagePickerController Demo.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AGImagePickerController Demo.xcodeproj/xcuserdata/xummer.xcuserdatad/xcschemes/xcschememanagement.plist b/AGImagePickerController Demo.xcodeproj/xcuserdata/xummer.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..f777f29 --- /dev/null +++ b/AGImagePickerController Demo.xcodeproj/xcuserdata/xummer.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + AGImagePickerController Demo.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + FE1E332314ED167800F6A6A2 + + primary + + + + + diff --git a/AGImagePickerController Demo/AGViewController.m b/AGImagePickerController Demo/AGViewController.m index 66314e8..88e328c 100644 --- a/AGImagePickerController Demo/AGViewController.m +++ b/AGImagePickerController Demo/AGViewController.m @@ -106,23 +106,24 @@ - (NSUInteger)supportedInterfaceOrientations - (void)openAction:(id)sender { // Show saved photos on top - ipc.shouldShowSavedPhotosOnTop = NO; - ipc.shouldChangeStatusBarStyle = YES; + ipc.shouldShowSavedPhotosOnTop = YES; + ipc.shouldChangeStatusBarStyle = NO; ipc.selection = self.selectedPhotos; + ipc.maximumNumberOfPhotosToBeSelected = 3; // ipc.maximumNumberOfPhotosToBeSelected = 10; // Custom toolbar items - AGIPCToolbarItem *selectAll = [[AGIPCToolbarItem alloc] initWithBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"+ Select All" style:UIBarButtonItemStyleBordered target:nil action:nil] andSelectionBlock:^BOOL(NSUInteger index, ALAsset *asset) { - return YES; - }]; - AGIPCToolbarItem *flexible = [[AGIPCToolbarItem alloc] initWithBarButtonItem:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil] andSelectionBlock:nil]; - AGIPCToolbarItem *selectOdd = [[AGIPCToolbarItem alloc] initWithBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"+ Select Odd" style:UIBarButtonItemStyleBordered target:nil action:nil] andSelectionBlock:^BOOL(NSUInteger index, ALAsset *asset) { - return !(index % 2); - }]; - AGIPCToolbarItem *deselectAll = [[AGIPCToolbarItem alloc] initWithBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"- Deselect All" style:UIBarButtonItemStyleBordered target:nil action:nil] andSelectionBlock:^BOOL(NSUInteger index, ALAsset *asset) { - return NO; - }]; - ipc.toolbarItemsForManagingTheSelection = @[selectAll, flexible, selectOdd, flexible, deselectAll]; +// AGIPCToolbarItem *selectAll = [[AGIPCToolbarItem alloc] initWithBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"+ Select All" style:UIBarButtonItemStyleBordered target:nil action:nil] andSelectionBlock:^BOOL(NSUInteger index, ALAsset *asset) { +// return YES; +// }]; +// AGIPCToolbarItem *flexible = [[AGIPCToolbarItem alloc] initWithBarButtonItem:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil] andSelectionBlock:nil]; +// AGIPCToolbarItem *selectOdd = [[AGIPCToolbarItem alloc] initWithBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"+ Select Odd" style:UIBarButtonItemStyleBordered target:nil action:nil] andSelectionBlock:^BOOL(NSUInteger index, ALAsset *asset) { +// return !(index % 2); +// }]; +// AGIPCToolbarItem *deselectAll = [[AGIPCToolbarItem alloc] initWithBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"- Deselect All" style:UIBarButtonItemStyleBordered target:nil action:nil] andSelectionBlock:^BOOL(NSUInteger index, ALAsset *asset) { +// return NO; +// }]; +// ipc.toolbarItemsForManagingTheSelection = @[selectAll, flexible, selectOdd, flexible, deselectAll]; // imagePickerController.toolbarItemsForManagingTheSelection = [NSArray array]; // imagePickerController.maximumNumberOfPhotos = 3; @@ -151,12 +152,12 @@ - (NSUInteger)agImagePickerController:(AGImagePickerController *)picker - (BOOL)agImagePickerController:(AGImagePickerController *)picker shouldDisplaySelectionInformationInSelectionMode:(AGImagePickerControllerSelectionMode)selectionMode { - return (selectionMode == AGImagePickerControllerSelectionModeSingle ? NO : YES); + return NO;//(selectionMode == AGImagePickerControllerSelectionModeSingle ? NO : YES); } - (BOOL)agImagePickerController:(AGImagePickerController *)picker shouldShowToolbarForManagingTheSelectionInSelectionMode:(AGImagePickerControllerSelectionMode)selectionMode { - return (selectionMode == AGImagePickerControllerSelectionModeSingle ? NO : YES); + return NO;//(selectionMode == AGImagePickerControllerSelectionModeSingle ? NO : YES); } - (AGImagePickerControllerSelectionBehaviorType)selectionBehaviorInSingleSelectionModeForAGImagePickerController:(AGImagePickerController *)picker diff --git a/AGImagePickerController/AGImagePickerController.bundle/AGIPC-Checkmark-iPad.png b/AGImagePickerController/AGImagePickerController.bundle/AGIPC-Checkmark-iPad.png index 49c9a522d788808e81d671fbe17666a7bab1fcfc..e4f4dc9b83ca25c183677eea276796903f002527 100644 GIT binary patch delta 867 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 MyaGL&JR)=c0YGH0%m4rY literal 4475 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 From 029ed6414c422d1ab4e2e9b109c0079b1bff14a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CXummer=E2=80=9D?= <“xummer26@gmail.com”> Date: Tue, 10 Jun 2014 10:42:31 +0800 Subject: [PATCH 15/18] add .gitignore --- .gitignore | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f3efd30 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +# Created by http://www.gitignore.io + +### Xcode ### +build +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcworkspace/contents.xcworkspacedata + + +### Objective-C ### +# OS X +.DS_Store + +# Xcode +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +profile +*.moved-aside +DerivedData +*.hmap +*.ipa + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control? +# +Pods/ + +# Custom +Headers/ +StaticLib/ From 6bae437258577b375b6ee95183d0968e5eff975c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CXummer=E2=80=9D?= <“xummer26@gmail.com”> Date: Tue, 10 Jun 2014 14:33:10 +0800 Subject: [PATCH 16/18] fix "shows 4 photos whether there is only 1 photo in last cell" --- AGImagePickerController/AGIPCGridCell.m | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/AGImagePickerController/AGIPCGridCell.m b/AGImagePickerController/AGIPCGridCell.m index 540523d..b9b0883 100644 --- a/AGImagePickerController/AGIPCGridCell.m +++ b/AGImagePickerController/AGIPCGridCell.m @@ -37,14 +37,11 @@ - (void)setItems:(NSArray *)items { _items = items; - for (UIView *view in [self.contentView subviews]) - { - [view removeFromSuperview]; - } + [[self.contentView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; for (AGIPCGridItem *gridItem in _items) { - [self addSubview:gridItem]; + [self.contentView addSubview:gridItem]; } } } From 402355da9c35d82f18a0d1b33b7e1643f748d6d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CXummer=E2=80=9D?= <“xummer26@gmail.com”> Date: Tue, 10 Jun 2014 15:50:26 +0800 Subject: [PATCH 17/18] fixed some memory leak --- AGImagePickerController Demo/AGViewController.m | 1 - AGImagePickerController/AGIPCAlbumsController.h | 2 +- AGImagePickerController/AGIPCAlbumsController.m | 7 ++++++- AGImagePickerController/AGIPCAssetsController.h | 2 +- AGImagePickerController/AGIPCAssetsController.m | 9 +++++---- AGImagePickerController/AGIPCGridCell.h | 2 +- AGImagePickerController/AGIPCGridCell.m | 9 +++------ AGImagePickerController/AGIPCGridItem.h | 2 +- AGImagePickerController/AGIPCGridItem.m | 2 +- 9 files changed, 19 insertions(+), 17 deletions(-) diff --git a/AGImagePickerController Demo/AGViewController.m b/AGImagePickerController Demo/AGViewController.m index 88e328c..729e733 100644 --- a/AGImagePickerController Demo/AGViewController.m +++ b/AGImagePickerController Demo/AGViewController.m @@ -110,7 +110,6 @@ - (void)openAction:(id)sender ipc.shouldChangeStatusBarStyle = NO; ipc.selection = self.selectedPhotos; ipc.maximumNumberOfPhotosToBeSelected = 3; -// ipc.maximumNumberOfPhotosToBeSelected = 10; // Custom toolbar items // AGIPCToolbarItem *selectAll = [[AGIPCToolbarItem alloc] initWithBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"+ Select All" style:UIBarButtonItemStyleBordered target:nil action:nil] andSelectionBlock:^BOOL(NSUInteger index, ALAsset *asset) { diff --git a/AGImagePickerController/AGIPCAlbumsController.h b/AGImagePickerController/AGIPCAlbumsController.h index 683f949..fb546fb 100644 --- a/AGImagePickerController/AGIPCAlbumsController.h +++ b/AGImagePickerController/AGIPCAlbumsController.h @@ -16,7 +16,7 @@ @interface AGIPCAlbumsController : UITableViewController -@property (strong) AGImagePickerController *imagePickerController; +@property (ag_weak) AGImagePickerController *imagePickerController; - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerController; diff --git a/AGImagePickerController/AGIPCAlbumsController.m b/AGImagePickerController/AGIPCAlbumsController.m index b16a88a..aa91a1d 100644 --- a/AGImagePickerController/AGIPCAlbumsController.m +++ b/AGImagePickerController/AGIPCAlbumsController.m @@ -17,7 +17,7 @@ @interface AGIPCAlbumsController () { NSMutableArray *_assetsGroups; - AGImagePickerController *_imagePickerController; + __ag_weak AGImagePickerController *_imagePickerController; } @property (ag_weak, nonatomic, readonly) NSMutableArray *assetsGroups; @@ -110,6 +110,11 @@ - (void)viewDidUnload [self unregisterFromNotifications]; } +- (void)dealloc { + // Destroy Notifications + [self unregisterFromNotifications]; +} + - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return YES; diff --git a/AGImagePickerController/AGIPCAssetsController.h b/AGImagePickerController/AGIPCAssetsController.h index a10129e..20bf18b 100644 --- a/AGImagePickerController/AGIPCAssetsController.h +++ b/AGImagePickerController/AGIPCAssetsController.h @@ -20,7 +20,7 @@ @property (strong) ALAssetsGroup *assetsGroup; @property (ag_weak, readonly) NSArray *selectedAssets; -@property (strong) AGImagePickerController *imagePickerController; +@property (ag_weak) AGImagePickerController *imagePickerController; - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerController andAssetsGroup:(ALAssetsGroup *)assetsGroup; diff --git a/AGImagePickerController/AGIPCAssetsController.m b/AGImagePickerController/AGIPCAssetsController.m index 5e74154..9a337fd 100644 --- a/AGImagePickerController/AGIPCAssetsController.m +++ b/AGImagePickerController/AGIPCAssetsController.m @@ -20,7 +20,7 @@ @interface AGIPCAssetsController () { ALAssetsGroup *_assetsGroup; NSMutableArray *_assets; - AGImagePickerController *_imagePickerController; + __ag_weak AGImagePickerController *_imagePickerController; } @property (nonatomic, strong) NSMutableArray *assets; @@ -169,10 +169,11 @@ - (NSArray *)itemsForRowAtIndexPath:(NSIndexPath *)indexPath NSUInteger startIndex = indexPath.row * self.imagePickerController.numberOfItemsPerRow, endIndex = startIndex + self.imagePickerController.numberOfItemsPerRow - 1; - if (startIndex < self.assets.count) + NSInteger assetsCount = [self.assets count]; + if (startIndex < assetsCount) { - if (endIndex > self.assets.count - 1) - endIndex = self.assets.count - 1; + if (endIndex > assetsCount - 1) + endIndex = assetsCount - 1; for (NSUInteger i = startIndex; i <= endIndex; i++) { diff --git a/AGImagePickerController/AGIPCGridCell.h b/AGImagePickerController/AGIPCGridCell.h index 879e99f..f4ca8df 100644 --- a/AGImagePickerController/AGIPCGridCell.h +++ b/AGImagePickerController/AGIPCGridCell.h @@ -16,7 +16,7 @@ @interface AGIPCGridCell : UITableViewCell @property (strong) NSArray *items; -@property (strong) AGImagePickerController *imagePickerController; +@property (ag_weak) AGImagePickerController *imagePickerController; - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerController items:(NSArray *)items andReuseIdentifier:(NSString *)identifier; diff --git a/AGImagePickerController/AGIPCGridCell.m b/AGImagePickerController/AGIPCGridCell.m index 540523d..12e692e 100644 --- a/AGImagePickerController/AGIPCGridCell.m +++ b/AGImagePickerController/AGIPCGridCell.m @@ -18,7 +18,7 @@ @interface AGIPCGridCell () { NSArray *_items; - AGImagePickerController *_imagePickerController; + __ag_weak AGImagePickerController *_imagePickerController; } @end @@ -37,14 +37,11 @@ - (void)setItems:(NSArray *)items { _items = items; - for (UIView *view in [self.contentView subviews]) - { - [view removeFromSuperview]; - } + [[self.contentView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; for (AGIPCGridItem *gridItem in _items) { - [self addSubview:gridItem]; + [self.contentView addSubview:gridItem]; } } } diff --git a/AGImagePickerController/AGIPCGridItem.h b/AGImagePickerController/AGIPCGridItem.h index ac609ce..9bbc1d7 100644 --- a/AGImagePickerController/AGIPCGridItem.h +++ b/AGImagePickerController/AGIPCGridItem.h @@ -35,7 +35,7 @@ @property (nonatomic, ag_weak) id delegate; -@property (strong) AGImagePickerController *imagePickerController; +@property (ag_weak) AGImagePickerController *imagePickerController; - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerController andAsset:(ALAsset *)asset; - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerController asset:(ALAsset *)asset andDelegate:(id)delegate; diff --git a/AGImagePickerController/AGIPCGridItem.m b/AGImagePickerController/AGIPCGridItem.m index 5ef441d..d1425f6 100644 --- a/AGImagePickerController/AGIPCGridItem.m +++ b/AGImagePickerController/AGIPCGridItem.m @@ -16,7 +16,7 @@ @interface AGIPCGridItem () { - AGImagePickerController *_imagePickerController; + __ag_weak AGImagePickerController *_imagePickerController; ALAsset *_asset; id __ag_weak _delegate; From 24392270baa98bea5976ed63beaea40554af7462 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CXummer=E2=80=9D?= <“xummer26@gmail.com”> Date: Thu, 19 Jun 2014 17:34:22 +0800 Subject: [PATCH 18/18] add Assets TableView scroll to bottom --- .../project.pbxproj | 8 +- .../UserInterfaceState.xcuserstate | Bin 43934 -> 0 bytes .../AGViewController.m | 91 ++++++++---------- .../AGIPCAlbumsController.m | 6 +- .../AGIPCAssetsController.m | 18 ++-- 5 files changed, 57 insertions(+), 66 deletions(-) delete mode 100644 AGImagePickerController Demo.xcodeproj/project.xcworkspace/xcuserdata/xummer.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/AGImagePickerController Demo.xcodeproj/project.pbxproj b/AGImagePickerController Demo.xcodeproj/project.pbxproj index b150683..5be8725 100644 --- a/AGImagePickerController Demo.xcodeproj/project.pbxproj +++ b/AGImagePickerController Demo.xcodeproj/project.pbxproj @@ -350,13 +350,15 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "AGImagePickerController Demo/AGImagePickerController Demo-Prefix.pch"; INFOPLIST_FILE = "AGImagePickerController Demo/AGImagePickerController Demo-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 4.3; PRODUCT_NAME = "$(TARGET_NAME)"; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + PROVISIONING_PROFILE = "6C433C2D-C147-40FD-B0BC-8B865CBC8444"; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = "6C433C2D-C147-40FD-B0BC-8B865CBC8444"; WRAPPER_EXTENSION = app; }; name = Debug; @@ -365,12 +367,14 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_ARC = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "AGImagePickerController Demo/AGImagePickerController Demo-Prefix.pch"; INFOPLIST_FILE = "AGImagePickerController Demo/AGImagePickerController Demo-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 4.3; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = "6C433C2D-C147-40FD-B0BC-8B865CBC8444"; WRAPPER_EXTENSION = app; }; name = Release; diff --git a/AGImagePickerController Demo.xcodeproj/project.xcworkspace/xcuserdata/xummer.xcuserdatad/UserInterfaceState.xcuserstate b/AGImagePickerController Demo.xcodeproj/project.xcworkspace/xcuserdata/xummer.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 6deb646fb566c6df653a6096b79970ff23a0443b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43934 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 L5x?&LCp_>!kOOdB diff --git a/AGImagePickerController Demo/AGViewController.m b/AGImagePickerController Demo/AGViewController.m index d756b61..5ccd7ab 100644 --- a/AGImagePickerController Demo/AGViewController.m +++ b/AGImagePickerController Demo/AGViewController.m @@ -32,42 +32,7 @@ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil if (self) { self.selectedPhotos = [NSMutableArray array]; - - __block AGViewController *blockSelf = self; - - //ipc = [[AGImagePickerController alloc] initWithDelegate:self]; - // modified by springox(20140503) - ipc = [AGImagePickerController sharedInstance:self]; - - ipc.didFailBlock = ^(NSError *error) { - NSLog(@"Fail. Error: %@", error); - - if (error == nil) { - [blockSelf.selectedPhotos removeAllObjects]; - NSLog(@"User has cancelled."); - - [blockSelf dismissModalViewControllerAnimated:YES]; - } else { - - // We need to wait for the view controller to appear first. - double delayInSeconds = 0.5; - dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); - dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ - [blockSelf dismissModalViewControllerAnimated:YES]; - }); - } - - [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES]; - - }; - ipc.didFinishBlock = ^(NSArray *info) { - [blockSelf.selectedPhotos setArray:info]; - - NSLog(@"Info: %@", info); - [blockSelf dismissModalViewControllerAnimated:YES]; - - [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES]; - }; + } return self; } @@ -106,28 +71,50 @@ - (NSUInteger)supportedInterfaceOrientations #pragma mark - Public methods - (void)openAction:(id)sender -{ +{ + + __block AGViewController *blockSelf = self; + + ipc = [[AGImagePickerController alloc] initWithDelegate:self]; + // modified by springox(20140503) + // ipc = [AGImagePickerController sharedInstance:self]; + + ipc.didFailBlock = ^(NSError *error) { + NSLog(@"Fail. Error: %@", error); + + if (error == nil) { + [blockSelf.selectedPhotos removeAllObjects]; + NSLog(@"User has cancelled."); + + [blockSelf dismissModalViewControllerAnimated:YES]; + } else { + + // We need to wait for the view controller to appear first. + double delayInSeconds = 0.5; + dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); + dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ + [blockSelf dismissModalViewControllerAnimated:YES]; + }); + } + + [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES]; + + }; + ipc.didFinishBlock = ^(NSArray *info) { + [blockSelf.selectedPhotos setArray:info]; + + NSLog(@"Info: %@", info); + [blockSelf dismissModalViewControllerAnimated:YES]; + + [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES]; + }; + // Show saved photos on top ipc.shouldShowSavedPhotosOnTop = YES; ipc.shouldChangeStatusBarStyle = NO; ipc.selection = self.selectedPhotos; ipc.maximumNumberOfPhotosToBeSelected = 3; - // Custom toolbar items -// AGIPCToolbarItem *selectAll = [[AGIPCToolbarItem alloc] initWithBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"+ Select All" style:UIBarButtonItemStyleBordered target:nil action:nil] andSelectionBlock:^BOOL(NSUInteger index, ALAsset *asset) { -// return YES; -// }]; -// AGIPCToolbarItem *flexible = [[AGIPCToolbarItem alloc] initWithBarButtonItem:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil] andSelectionBlock:nil]; -// AGIPCToolbarItem *selectOdd = [[AGIPCToolbarItem alloc] initWithBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"+ Select Odd" style:UIBarButtonItemStyleBordered target:nil action:nil] andSelectionBlock:^BOOL(NSUInteger index, ALAsset *asset) { -// return !(index % 2); -// }]; -// AGIPCToolbarItem *deselectAll = [[AGIPCToolbarItem alloc] initWithBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"- Deselect All" style:UIBarButtonItemStyleBordered target:nil action:nil] andSelectionBlock:^BOOL(NSUInteger index, ALAsset *asset) { -// return NO; -// }]; -// ipc.toolbarItemsForManagingTheSelection = @[selectAll, flexible, selectOdd, flexible, deselectAll]; -// imagePickerController.toolbarItemsForManagingTheSelection = [NSArray array]; - -// imagePickerController.maximumNumberOfPhotos = 3; [self presentModalViewController:ipc animated:YES]; // modified by springox(20140503) diff --git a/AGImagePickerController/AGIPCAlbumsController.m b/AGImagePickerController/AGIPCAlbumsController.m index 0030aca..423fd2a 100644 --- a/AGImagePickerController/AGIPCAlbumsController.m +++ b/AGImagePickerController/AGIPCAlbumsController.m @@ -18,6 +18,7 @@ @interface AGIPCAlbumsController () { NSMutableArray *_assetsGroups; __ag_weak AGImagePickerController *_imagePickerController; + NSUInteger _pushTryCount; } @end @@ -136,10 +137,9 @@ - (void)pushFirstAssetsController AGIPCAssetsController *controller = [[AGIPCAssetsController alloc] initWithImagePickerController:self.imagePickerController andAssetsGroup:self.assetsGroups[0]]; [self.navigationController pushViewController:controller animated:NO]; } else { - static int tryCount; - if (tryCount < 3) { + if (_pushTryCount < 3) { [self performSelector:@selector(pushFirstAssetsController) withObject:nil afterDelay:0.8]; - ++tryCount; + ++_pushTryCount; } } } diff --git a/AGImagePickerController/AGIPCAssetsController.m b/AGImagePickerController/AGIPCAssetsController.m index 5ae10e2..d43ae6d 100644 --- a/AGImagePickerController/AGIPCAssetsController.m +++ b/AGImagePickerController/AGIPCAssetsController.m @@ -141,7 +141,7 @@ - (id)initWithImagePickerController:(AGImagePickerController *)imagePickerContro [self setupToolbarItems]; // Start loading the assets - [self loadAssets]; + [self performSelectorInBackground:@selector(loadAssets) withObject:nil]; } return self; @@ -339,9 +339,7 @@ - (void)loadAssets } dispatch_async(dispatch_get_main_queue(), ^{ - [strongSelf reloadData]; - }); }); @@ -357,13 +355,15 @@ - (void)reloadData //[self setTitle:[self.assetsGroup valueForProperty:ALAssetsGroupPropertyName]]; [self changeSelectionInformation]; - /* - NSInteger totalRows = [self.tableView numberOfRowsInSection:0]; - //Prevents crash if totalRows = 0 (when the album is empty). - if (totalRows > 0) { - [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:totalRows-1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:NO]; + NSInteger section = [self numberOfSectionsInTableView:self.tableView] - 1; + NSInteger row = [self tableView:self.tableView numberOfRowsInSection:section] - 1; + if (section >= 0 && row >= 0) { + NSIndexPath *ip = [NSIndexPath indexPathForRow:row + inSection:section]; + [self.tableView scrollToRowAtIndexPath:ip + atScrollPosition:UITableViewScrollPositionBottom + animated:NO]; } - */ } - (void)doneAction:(id)sender