如下图所示 在本地相册中选择一张图片后,我们将他拷贝至沙盒当中,在客户端中将它的缩略图放在按钮旁边,这个结构其实和新浪微薄中选择图片后的效果一样。最终点击发送将按钮将图片2进制图片上传服务器。

下面我们仔细学习具体的细节。创建一个空的IOS项目,接着在创建一个ViewController。
AppDelegate.h 应用的代理类 这个没什么好说的就是直接打开刚刚创建的新ViewController。
1 |
#import <UIKit/UIKit.h> |
2 |
#import "TestViewController.h" |
4 |
@interface AppDelegate : UIResponder <UIApplicationDelegate> |
6 |
@property (strong, nonatomic) UIWindow *window; |
7 |
@property (strong, nonatomic) UINavigationController *navController; |
8 |
@property (strong, nonatomic) UIViewController *viewController; |
AppDelegate.m 在这里就是打开我们创建的TestViewController
01 |
#import "AppDelegate.h" |
03 |
@implementation AppDelegate |
05 |
@synthesize window = _window; |
06 |
@synthesize navController; |
07 |
@synthesize viewController; |
15 |
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions |
17 |
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; |
19 |
self.window.backgroundColor = [UIColor whiteColor]; |
20 |
self.viewController = [[TestViewController alloc]init]; |
21 |
self.navController = [[UINavigationController alloc] initWithRootViewController:self.viewController]; |
22 |
[self.window addSubview:navController.view]; |
24 |
[self.window makeKeyAndVisible]; |
TestViewController.h 注意这里面引入了很多代理类。
01 |
#import <UIKit/UIKit.h> |
03 |
@interface TestViewController : UIViewController<UITextViewDelegate,UIActionSheetDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate> |
06 |
UITextView *_textEditor; |
09 |
UIActionSheet *myActionSheet; |
TestViewController.m 请大家仔细看这个类, 所有的东西都写在了这里哈。
001 |
#import "TestViewController.h" |
003 |
@interface TestViewController () |
007 |
@implementation TestViewController |
013 |
self.navigationItem.title = @"雨松MOMO输入框"; |
016 |
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] |
018 |
style: UIBarButtonItemStyleDone |
020 |
action: @selector(sendInfo)] autorelease]; |
023 |
_textEditor = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)]; |
025 |
_textEditor.delegate = self; |
026 |
_textEditor.autoresizingMask = UIViewAutoresizingFlexibleWidth; |
027 |
_textEditor.keyboardType = UIKeyboardTypeDefault; |
028 |
_textEditor.font = [UIFont systemFontOfSize:20]; |
029 |
_textEditor.text = @"请输入内容"; |
032 |
//这里表示进入当前ViewController直接打开软键盘 |
033 |
[_textEditor becomeFirstResponder]; |
036 |
[self.view addSubview:_textEditor]; |
038 |
//下方的图片按钮 点击后呼出菜单 打开摄像机 查找本地相册 |
039 |
UIImage *image = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"camera" ofType:@"png"]]; |
041 |
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; |
042 |
button.frame = CGRectMake(0, 120, image.size.width, image.size.height); |
044 |
[button setImage:image forState:UIControlStateNormal]; |
046 |
[button addTarget:self action:@selector(openMenu) forControlEvents:UIControlEventTouchUpInside]; |
049 |
[self.view addSubview:button]; |
056 |
myActionSheet = [[UIActionSheet alloc] |
059 |
cancelButtonTitle:@"取消" |
060 |
destructiveButtonTitle:nil |
061 |
otherButtonTitles: @"打开照相机", @"从手机相册获取",nil]; |
063 |
[myActionSheet showInView:self.view]; |
064 |
[myActionSheet release]; |
068 |
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex |
072 |
if (buttonIndex == myActionSheet.cancelButtonIndex) |
092 |
UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera; |
093 |
if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) |
095 |
UIImagePickerController *picker = [[UIImagePickerController alloc] init]; |
096 |
picker.delegate = self; |
098 |
picker.allowsEditing = YES; |
099 |
picker.sourceType = sourceType; |
101 |
[self presentModalViewController:picker animated:YES]; |
104 |
NSLog(@"模拟其中无法打开照相机,请在真机中使用"); |
111 |
UIImagePickerController *picker = [[UIImagePickerController alloc] init]; |
113 |
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; |
114 |
picker.delegate = self; |
116 |
picker.allowsEditing = YES; |
117 |
[self presentModalViewController:picker animated:YES]; |
122 |
-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info |
126 |
NSString *type = [info objectForKey:UIImagePickerControllerMediaType]; |
129 |
if ([type isEqualToString:@"public.image"]) |
132 |
UIImage* image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; |
134 |
if (UIImagePNGRepresentation(image) == nil) |
136 |
data = UIImageJPEGRepresentation(image, 1.0); |
140 |
data = UIImagePNGRepresentation(image); |
144 |
//这里将图片放在沙盒的documents文件夹中 |
145 |
NSString * DocumentsPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; |
148 |
NSFileManager *fileManager = [NSFileManager defaultManager]; |
150 |
//把刚刚图片转换的data对象拷贝至沙盒中 并保存为image.png |
151 |
[fileManager createDirectoryAtPath:DocumentsPath withIntermediateDirectories:YES attributes:nil error:nil]; |
152 |
[fileManager createFileAtPath:[DocumentsPath stringByAppendingString:@"/image.png"] contents:data attributes:nil]; |
155 |
filePath = [[NSString alloc]initWithFormat:@"%@%@",DocumentsPath, @"/image.png"]; |
158 |
[picker dismissModalViewControllerAnimated:YES]; |
162 |
UIImageView *smallimage = [[[UIImageView alloc] initWithFrame: |
163 |
CGRectMake(50, 120, 40, 40)] autorelease]; |
165 |
smallimage.image = image; |
167 |
[self.view addSubview:smallimage]; |
173 |
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker |
176 |
[picker dismissModalViewControllerAnimated:YES]; |
181 |
NSLog(@"图片的路径是:%@", filePath); |
183 |
NSLog(@"您输入框中的内容是:%@", _textEditor.text); |
186 |
- (void)viewDidUnload |
188 |
[super viewDidUnload]; |
189 |
// Release any retained subviews of the main view. |
192 |
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation |
194 |
return (interfaceOrientation == UIInterfaceOrientationPortrait); |
如下图所示,打开下拉菜单按钮开始选择打开相机 或者 打开本地相册。模拟器中是无法打开照相机的的,切记。

如下图所示,这里就是我本地的相册啦,里面保存了几张图片,选择一张即可。

我在这里再说说图片上传, 图片上传我们采用的是2进制ASIHTTPRequest 来完成的。
发送请求
01 |
NSString *server_base = [NSString stringWithFormat:@"%@/users/uploadResource.json", _server]; |
03 |
ASINetworkQueue *queue = [[ASINetworkQueue alloc] init]; |
05 |
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:server_base]]; |
07 |
[ASIHTTPRequest setShouldUpdateNetworkActivityIndicator: NO]; |
08 |
[request setDelegate :self]; |
09 |
[request setDidFinishSelector:@selector(sendCommentSucc:)]; |
10 |
[request setDidFailSelector:@selector(sendCommentFail:)]; |
12 |
[request setFile:res forKey:@"res"]; |
14 |
[queue addOperation:request]; |
最后是文本的源码下载地址:http://vdisk.weibo.com/s/accm9
- IOS研究院之打开照相机与本地相册选择图片(六)
原创文章如需转载请注明:转载自雨松MOMO程序研究院本文链接地址:IOS研究院之打开照相机与本地相册选择图片(六) Hello 大家好 IOS的文章好久都木有更新了,今天更新一篇哈. 这篇文章主要学习 ...
- 微信小程序:从本地相册选择图片或使用相机拍照。
wx.chooseImage(OBJECT) 从本地相册选择图片或使用相机拍照. OBJECT参数说明: 示例代码: wx.chooseImage({ count: 1, // 默认9 sizeTyp ...
- android 开启本地相册选择图片并返回显示
.java package com.jerry.crop; import java.io.File; import android.app.Activity; import android.conte ...
- 微信小程序chooseImage(从本地相册选择图片或使用相机拍照)
一.使用API wx.chooseImage(OBJECT) var util = require('../../utils/util.js') Page({ data:{ src:"../ ...
- HTML5 Plus 拍照或者相册选择图片上传
HBuilder+HTML5 Plus+MUI实现拍照或者相册选择图片上传,利用HTML5 Plus的Camera.Gallery.IO.Storage和Uploader来实现手机APP拍照或者从相册 ...
- [Android实例教程] 教你如何拍照+相册选择图片+剪裁图片完整实现
[Android实例教程] 教你如何拍照+相册选择图片+剪裁图片完整实现 今天做Android项目的时候要用到图片选择,要实现拍照获取图片和从相册获取图片,并且要求在获取完之后可以裁剪,试了很多方法之 ...
- 调用原生硬件 Api 实现照相机 拍照和相册选择 以及拍照上传
一.Flutter image_picker 实现相机拍照和相册选择 https://pub.dev/packages/image_picker 二.Flutter 上传图片到服务器 ht ...
- ng-cordova 手机拍照或从相册选择图片
1.需求描述 实现一个调用摄像头拍照,或者直接打开本地图库选择照片,然后替换App中图片的功能 2.准备 1) 安装ng-cordova 进入到ionic工程目录,使用bower工具安装, bower ...
- 浅谈Android中拍照、从相册选择图片并截图相关知识点
前言 我们在Android开发中经常会需要使用相机或者从相册中选取图片的情况,今天就把这里面相关的知识点总结下,方便以后开发的时候使用. 1.相机拍照并可自定义截图功能 我们先来看如何使用Intent ...
随机推荐
- python运维开发(八)----面向对象(下)
内容目录: 面向对象三大特性之多态性 面向对象中的成员:字段.方法.属性 类的成员修饰符 类的特殊成员 特殊成员方法 面向对象其他 异常处理 设计模式之单例模式 面向对象的多态性 多态性:即指多种形态 ...
- ZJUTACM(hd1259)
ZJUTACM 点我 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- MVC 视频笔记
1.关闭Jquery的浏览器缓存 $.ajaxSetup({cache:fasle});
- 封装fastjson为spring mvc的json view
可以将其中的main方法删掉.测试用的.我测试的结果是,jackson比fastjson快. fastjson是1.1.36 jackson是2.2.3 jdk是1.7.40,client cpu是i ...
- __declspec,__cdecl,__stdcall都是什么意思?有什么作用?
__cdecl和__stdcall都是函数调用规范(还有一个__fastcall),规定了参数出入栈的顺序和方法,如果只用VC编程的话可以不用关心,但是要在C++和Pascal等其他语言通信的时候就要 ...
- MFC永久窗口对象与临时窗口对象
这篇讲得很清楚,就转过来了,原文如下: 因项目需要,最近在学习MFC,下午在一篇教程中提到了临时窗口.永久窗口,作者让读者自行查阅MSDN,了解临时窗口与永久窗口的概念,出于好奇,出于方便,直接百度一 ...
- Java泛型介绍!!!
Java总结篇系列:Java泛型 转自:http://www.cnblogs.com/lwbqqyumidi/p/3837629.html 一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下 ...
- yum cannot retrieve metalink for repository
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
- 网易云课堂_C++开发入门到精通_章节4:运算符重载
课时23运算符重载 运算符重载 重载赋值运算符 Person& Person::operator=(const Person& other) { //检查自赋值 if (this == ...
- Xcoder 7.0 免证书真机测试
相信大家已经看了WWDC大会上的内容了,在iOS9和Xcoder7.0以后真机测试不需要在购买付费账号了,(当然你要想上传appstore还是需要付费账号的). 今天我带大家来看下免证书的真机测试如何 ...