如下图所示 在本地相册中选择一张图片后,我们将他拷贝至沙盒当中,在客户端中将它的缩略图放在按钮旁边,这个结构其实和新浪微薄中选择图片后的效果一样。最终点击发送将按钮将图片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 Challenge 过关心得(0)
最近开始用Openerp进行开发,在python语言本身上并没有什么太大的进展,于是决定利用空闲时间做一点python练习. 最终找到了这款叫做Python Challenge(http://www. ...
- 从数据库读取数据后显示成html标签
也许很多人从数据库中读的数据是不需要数据成html标签的,但是也许有一天你们会发现当我们需要输出成html标签时编译器却自动帮我们输出成字符串了这是我们可以这样来 方法1: 最常用的方法,使用JS或J ...
- android的listview组件
http://www.cnblogs.com/menlsh/archive/2013/03/15/2962350.html http://www.tuicool.com/articles/IveeI3 ...
- grok 正则解析日志例子<1>
<pre name="code" class="html">下面是日志的样子 55.3.244.1 GET /index.html 15824 0. ...
- bzoj3299 [USACO2011 Open]Corn Maze玉米迷宫
Description 今年秋天,约翰带着奶牛们去玩玉米迷宫.迷宫可分成NxM个格子,有些格子种了玉 米,种宥玉米的格子无法通行. 迷宫的四条边界上都是种了玉米的格子,其屮只有一个格子 没种,那就是 ...
- JavaScript声音播放
方式一: /** * 播放音频(Chrome.opera)支持 * @param file:支持 rm,mid,wav */ function playAudio(file) { var embed= ...
- 电子科大POJ "整数的千位分隔"
整数的千位分隔 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) C-source ...
- ID3决策树算法原理及C++实现(其中代码转自别人的博客)
分类是数据挖掘中十分重要的组成部分.分类作为一种无监督学习方式被广泛的使用. 之前关于"数据挖掘中十大经典算法"中,基于ID3核心思想的分类算法C4.5榜上有名.所以不难看出ID3 ...
- uva156 By sixleaves
1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 #include <ma ...
- ios中block中的探究
http://blog.csdn.net/jasonblog/article/details/7756763