iOS Assets Library
#import <AssetsLibrary/AssetsLibrary.h> -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { [self dismissViewControllerAnimated:YES completion:nil]; NSURL * assetUrl = [info objectForKey:UIImagePickerControllerReferenceURL]; NSLog(@"%@", assetUrl.absoluteString); //"assets-library://asset/asset.JPG?id=ABC7EF08-B1BF-4FFB-9FF9-4FF70FD0610F&ext=JPG" [self loadImageFromAsset:assetUrl]; } -(void)loadImageFromAsset:(NSURL *)assetUrl { ALAssetsLibrary * assetLib = [[ALAssetsLibrary alloc] init]; [assetLib assetForURL:assetUrl resultBlock:^(ALAsset * asset) { ALAssetRepresentation * assetRep = [asset defaultRepresentation]; CGImageRef image = [assetRep fullScreenImage]; //full-screen-image to show edited version [self setImageViewWithImage:image]; } failureBlock:^(NSError * error) { //log... }]; } -(void)setImageViewWithImage:(CGImageRef)image { UIImageView * imageView = (UIImageView *)[[self view] viewWithTag:ivTag]; [imageView setImage:[UIImage imageWithCGImage:image]]; } -----------------------------------------------------------
Objective-C Delegate Protocol
Use UIResponder touchesBegan:withEvent and a protocol to enable a UIImageView to respond to user touch. Sends message to delegate (view controller in this example), delegate can then respond to image touch by launching image picker, etcStoryboard - ESTouchImageView Settings
Components
ESTouchViewDelegate (Protocol)
- declares the protocol delegate method esTouchViewMsg
- when the user touches a view, an esTouchViewMsg should be sent to the delegate (class) that conforms to the protocol
//file ESTouchViewDelegate.h @protocol ESTouchViewDelegate<NSObject> -(void)esTouchViewMsg; @end
ESTouchImageView (Custom UIImageView Class)
- has ESTouchViewDelegate protocol property
- on touchesBegan:withEvent: sends esTouchViewMsg to delegate (class) that conforms to the protocol
//file ESTouchImageView.h #import "ESTouchViewDelegate.h" @interface ESTouchImageView: UIImageView @property (weak, nonatomic) id<ESTouchViewDelegate> esTouchViewDelegate; @end //file ESTouchImageView.m #import "ESTouchImageView.h" @implementation ESTouchImageView //send touch message to delegate from UIResponder touches began event -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"ESTouchImageView - touchesBegan"); [self sendESTouchViewMsgToDelegate]; } -(void)sendESTouchViewMsgToDelegate { NSLog(@"ESTouchImageView - sendESTouchViewMsgToDelegate"); [[self esTouchViewDelegate] esTouchViewMsg]; } @end
ESViewController (Delegate)
- has ESTouchImageView control
- conforms to the ESTouchViewDelegate protocol
- is the delegate (ESTouchViewDelegate) for ESTouchImageView
- sets self (view controller) as delegate using IBOutlet property (or viewWithTag reference)
- will respond to the esTouchViewMsg delegate method
//file ESViewController.h #import "ESTouchImageView.h" @interface ESViewController: UIViewController<ESTouchViewDelegate> @property (weak, nonatomic) IBOutlet ESTouchImageView * esTouchImageView; @end //file ESViewController.m #import "ESViewController.h" @implementation ESViewController -(void)viewDidLoad { [super viewDidLoad]; //set delegate using IBOutlet property [[self esTouchImageView] setEsTouchViewDelegate:self]; //set view controller as delegate //set delegate using viewWithTag reference //ESTouchImageView * esTouchImageView = (ESTouchImageView *)[[self view] viewWithTag:100]; //[esTouchImageView setEsTouchViewDelegate:self]; //set view controller as delegate } -(void)esTouchViewMsg { NSLog(@"ESViewController - esTouchViewMsg"); //launch image picker, etc } @end
NSLog Output
ESTouchImageView - touchesBegan ESTouchImageView - sendESTouchViewMsgToDelegate ESViewController - esTouchViewMsg -----------------------------------------------------------
Objective-C Delegate Protocol
On scene exit, send exit message from destination/presented view to the source/presenting view, pass bool indicating cancelled//file ESExitSceneDelegate.h @protocol ESExitSceneDelegate<NSObject> @optional -(void)esExitSceneMsg; -(void)esExitSceneMsgCancelled:(BOOL)cancelled; @end //file ESEditViewController.h #import "ESExitSceneDelegate.h" //protocol @interface ESEditViewController: UITableViewController @property (weak, nonatomic) id<ESExitSceneDelegate> esExitSceneDelegate; // @property (weak, nonatomic) IBOutlet UIBarButtonItem * uiCancelBtn; @property (weak, nonatomic) IBOutlet UIBarButtonItem * uiSaveBtn; @end //file ESEditViewController.m #import "ESEditViewController.h" @implementation ESEditViewController { //ivar referencing outlet, alt to prop IBOutlet UIBarButtonItem * uiCancelBtn; } -(IBAction)cancel:(id)sender { [[self navigationController] popToRootViewControllerAnimated:YES]; [[self esExitSceneDelegate] esExitSceneMsgCancelled:YES]; } -(IBAction)save:(id)sender { [[self navigationController] popToRootViewControllerAnimated:YES]; [[self esExitSceneDelegate] esExitSceneMsgCancelled:NO]; } //file ESViewController.h #import "ESExitSceneDelegate.h" //protocol @interface ESViewController: UIViewController<ESExitSceneDelegate> @end //file ESViewController.m #import "ESEditViewController.h" #import "ESViewController.h" @implementation ESViewController -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { ESEditViewController * esEditViewController = segue.destinationViewController; [esEditViewController setEsExitSceneDelegate:self]; //set delegate } -(void)esExitSceneMsgCancelled:(BOOL)cancelled { if (cancelled) { //... } else { //... } } @end