IOS研究院之打开照相机与本地相册选择图片(六)
2013-10-22 20:23 Lves Li 阅读(225) 评论(0) 编辑 收藏 举报
原创文章如需转载请注明:转载自雨松MOMO程序研究院本文链接地址:IOS研究院之打开照相机与本地相册选择图片(六)Hello 大家好 IOS的文章好久都木有更新了,今天更新一篇哈。 这篇文章主要学习如何在IOS程序中打开照相机与本地相册并且选择一张图片。还是老样子MOMO写了一个简单的测试程序,如下图所示 在本地相册中选择一张图片后,我们将他拷贝至沙盒当中,在客户端中将它的缩略图放在按钮旁边,这个结构其实和新浪微薄中选择图片后的效果一样。最终点击发送将按钮将图片2进制图片上传服务器。
下面我们仔细学习具体的细节。创建一个空的IOS项目,接着在创建一个ViewController。 AppDelegate.h 应用的代理类 这个没什么好说的就是直接打开刚刚创建的新ViewController。 #import <UIKit/UIKit.h> #import "TestViewController.h" @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) UINavigationController *navController; @property (strong, nonatomic) UIViewController *viewController; @end
AppDelegate.m 在这里就是打开我们创建的TestViewController #import "AppDelegate.h" @implementation AppDelegate @synthesize window = _window; @synthesize navController; @synthesize viewController; - (void)dealloc { [_window release]; [super dealloc]; } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; self.window.backgroundColor = [UIColor whiteColor]; self.viewController = [[TestViewController alloc]init]; self.navController = [[UINavigationController alloc] initWithRootViewController:self.viewController]; [self.window addSubview:navController.view]; [self.window makeKeyAndVisible]; return YES; } @end
TestViewController.h 注意这里面引入了很多代理类。 #import <UIKit/UIKit.h> @interface TestViewController : UIViewController<UITextViewDelegate,UIActionSheetDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate> { //输入框 UITextView *_textEditor; //下拉菜单 UIActionSheet *myActionSheet; //图片2进制路径 NSString* filePath; } @end
TestViewController.m 请大家仔细看这个类, 所有的东西都写在了这里哈。 #import "TestViewController.h" @interface TestViewController () @end @implementation TestViewController - (void)viewDidLoad { [super viewDidLoad]; //导航栏标题 self.navigationItem.title = @"雨松MOMO输入框"; //导航栏按钮 self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle: @"发送" style: UIBarButtonItemStyleDone target: self action: @selector(sendInfo)] autorelease]; //输入框显示区域 _textEditor = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)]; //设置它的代理 _textEditor.delegate = self; _textEditor.autoresizingMask = UIViewAutoresizingFlexibleWidth; _textEditor.keyboardType = UIKeyboardTypeDefault; _textEditor.font = [UIFont systemFontOfSize:20]; _textEditor.text = @"请输入内容"; //默认软键盘是在触摸区域后才会打开 //这里表示进入当前ViewController直接打开软键盘 [_textEditor becomeFirstResponder]; //把输入框加在视图中 [self.view addSubview:_textEditor]; //下方的图片按钮 点击后呼出菜单 打开摄像机 查找本地相册 UIImage *image = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"camera" ofType:@"png"]]; UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(0, 120, image.size.width, image.size.height); [button setImage:image forState:UIControlStateNormal]; [button addTarget:self action:@selector(openMenu) forControlEvents:UIControlEventTouchUpInside]; //把它也加在视图当中 [self.view addSubview:button]; } -(void)openMenu { //在这里呼出下方菜单按钮项 myActionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles: @"打开照相机", @"从手机相册获取",nil]; [myActionSheet showInView:self.view]; [myActionSheet release]; } - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { //呼出的菜单按钮点击后的响应 if (buttonIndex == myActionSheet.cancelButtonIndex) { NSLog(@"取消"); } switch (buttonIndex) { case 0: //打开照相机拍照 [self takePhoto]; break; case 1: //打开本地相册 [self LocalPhoto]; break; } } //开始拍照 -(void)takePhoto { UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera; if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; //设置拍照后的图片可被编辑 picker.allowsEditing = YES; picker.sourceType = sourceType; [picker release]; [self presentModalViewController:picker animated:YES]; }else { NSLog(@"模拟其中无法打开照相机,请在真机中使用"); } } //打开本地相册 -(void)LocalPhoto { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; picker.delegate = self; //设置选择后的图片可被编辑 picker.allowsEditing = YES; [self presentModalViewController:picker animated:YES]; [picker release]; } //当选择一张图片后进入这里 -(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { NSString *type = [info objectForKey:UIImagePickerControllerMediaType]; //当选择的类型是图片 if ([type isEqualToString:@"public.image"]) { //先把图片转成NSData UIImage* image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; NSData *data; if (UIImagePNGRepresentation(image) == nil) { data = UIImageJPEGRepresentation(image, 1.0); } else { data = UIImagePNGRepresentation(image); } //图片保存的路径 //这里将图片放在沙盒的documents文件夹中 NSString * DocumentsPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; //文件管理器 NSFileManager *fileManager = [NSFileManager defaultManager]; //把刚刚图片转换的data对象拷贝至沙盒中 并保存为image.png [fileManager createDirectoryAtPath:DocumentsPath withIntermediateDirectories:YES attributes:nil error:nil]; [fileManager createFileAtPath:[DocumentsPath stringByAppendingString:@"/image.png"] contents:data attributes:nil]; //得到选择后沙盒中图片的完整路径 filePath = [[NSString alloc]initWithFormat:@"%@%@",DocumentsPath, @"/image.png"]; //关闭相册界面 [picker dismissModalViewControllerAnimated:YES]; //创建一个选择后图片的小图标放在下方 //类似微薄选择图后的效果 UIImageView *smallimage = [[[UIImageView alloc] initWithFrame: CGRectMake(50, 120, 40, 40)] autorelease]; smallimage.image = image; //加在视图中 [self.view addSubview:smallimage]; } } - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { NSLog(@"您取消了选择图片"); [picker dismissModalViewControllerAnimated:YES]; } -(void)sendInfo { NSLog(@"图片的路径是:%@", filePath); NSLog(@"您输入框中的内容是:%@", _textEditor.text); } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait); } @end
如下图所示,打开下拉菜单按钮开始选择打开相机 或者 打开本地相册。模拟器中是无法打开照相机的的,切记。
如下图所示,这里就是我本地的相册啦,里面保存了几张图片,选择一张即可。
我在这里再说说图片上传, 图片上传我们采用的是2进制ASIHTTPRequest 来完成的。 发送请求
NSString *server_base = [NSString stringWithFormat:@"%@/users/uploadResource.json", _server]; ASINetworkQueue *queue = [[ASINetworkQueue alloc] init]; ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:server_base]]; [ASIHTTPRequest setShouldUpdateNetworkActivityIndicator: NO]; [request setDelegate :self]; [request setDidFinishSelector:@selector(sendCommentSucc:)]; [request setDidFailSelector:@selector(sendCommentFail:)]; // res 就是 需要上传图片文件的路径 [request setFile:res forKey:@"res"]; [queue addOperation:request]; [queue go];
最后是文本的源码,雨松MOMO祝大家学习愉快,不早了,我也得睡觉啦,1点多了。。。 |