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, etc
Storyboard - 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