如下图所示 在本地相册中选择一张图片后,我们将他拷贝至沙盒当中,在客户端中将它的缩略图放在按钮旁边,这个结构其实和新浪微薄中选择图片后的效果一样。最终点击发送将按钮将图片2进制图片上传服务器。
下面我们仔细学习具体的细节。创建一个空的IOS项目,接着在创建一个ViewController。
AppDelegate.h 应用的代理类 这个没什么好说的就是直接打开刚刚创建的新ViewController。
1 | #import <UIKit/UIKit.h> |
2 | #import "TestViewController.h" |
3 |
4 | @interface AppDelegate : UIResponder <UIApplicationDelegate> |
5 |
6 | @property (strong, nonatomic) UIWindow *window; |
7 | @property (strong, nonatomic) UINavigationController *navController; |
8 | @property (strong, nonatomic) UIViewController *viewController; |
9 | @end |
AppDelegate.m 在这里就是打开我们创建的TestViewController
01 | #import "AppDelegate.h" |
02 |
03 | @implementation AppDelegate |
04 |
05 | @synthesize window = _window; |
06 | @synthesize navController; |
07 | @synthesize viewController; |
08 |
09 | - ( void )dealloc |
10 | { |
11 | [_window release]; |
12 | [super dealloc]; |
13 | } |
14 |
15 | - ( BOOL )application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions |
16 | { |
17 | self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; |
18 |
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]; |
23 |
24 | [self.window makeKeyAndVisible]; |
25 | return YES; |
26 | } |
27 |
28 | @end |
TestViewController.h 注意这里面引入了很多代理类。
01 | #import <UIKit/UIKit.h> |
02 |
03 | @interface TestViewController : UIViewController<UITextViewDelegate,UIActionSheetDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate> |
04 | { |
05 | //输入框 |
06 | UITextView *_textEditor; |
07 |
08 | //下拉菜单 |
09 | UIActionSheet *myActionSheet; |
10 |
11 | //图片2进制路径 |
12 | NSString* filePath; |
13 | } |
14 | @end |
TestViewController.m 请大家仔细看这个类, 所有的东西都写在了这里哈。
001 | #import "TestViewController.h" |
002 |
003 | @interface TestViewController () |
004 |
005 | @end |
006 |
007 | @implementation TestViewController |
008 |
009 | - ( void )viewDidLoad |
010 | { |
011 | [super viewDidLoad]; |
012 | //导航栏标题 |
013 | self.navigationItem.title = @ "雨松MOMO输入框" ; |
014 |
015 | //导航栏按钮 |
016 | self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] |
017 | initWithTitle: @ "发送" |
018 | style: UIBarButtonItemStyleDone |
019 | target: self |
020 | action: @selector(sendInfo)] autorelease]; |
021 |
022 | //输入框显示区域 |
023 | _textEditor = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)]; |
024 | //设置它的代理 |
025 | _textEditor.delegate = self; |
026 | _textEditor.autoresizingMask = UIViewAutoresizingFlexibleWidth; |
027 | _textEditor.keyboardType = UIKeyboardTypeDefault; |
028 | _textEditor.font = [UIFont systemFontOfSize:20]; |
029 | _textEditor.text = @ "请输入内容" ; |
030 |
031 | //默认软键盘是在触摸区域后才会打开 |
032 | //这里表示进入当前ViewController直接打开软键盘 |
033 | [_textEditor becomeFirstResponder]; |
034 |
035 | //把输入框加在视图中 |
036 | [self.view addSubview:_textEditor]; |
037 |
038 | //下方的图片按钮 点击后呼出菜单 打开摄像机 查找本地相册 |
039 | UIImage *image = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@ "camera" ofType:@ "png" ]]; |
040 |
041 | UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; |
042 | button.frame = CGRectMake(0, 120, image.size.width, image.size.height); |
043 |
044 | [button setImage:image forState:UIControlStateNormal]; |
045 |
046 | [button addTarget:self action:@selector(openMenu) forControlEvents:UIControlEventTouchUpInside]; |
047 |
048 | //把它也加在视图当中 |
049 | [self.view addSubview:button]; |
050 |
051 | } |
052 |
053 | -( void )openMenu |
054 | { |
055 | //在这里呼出下方菜单按钮项 |
056 | myActionSheet = [[UIActionSheet alloc] |
057 | initWithTitle:nil |
058 | delegate:self |
059 | cancelButtonTitle:@ "取消" |
060 | destructiveButtonTitle:nil |
061 | otherButtonTitles: @ "打开照相机" , @ "从手机相册获取" ,nil]; |
062 |
063 | [myActionSheet showInView:self.view]; |
064 | [myActionSheet release]; |
065 |
066 | } |
067 |
068 | - ( void )actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex |
069 | { |
070 |
071 | //呼出的菜单按钮点击后的响应 |
072 | if (buttonIndex == myActionSheet.cancelButtonIndex) |
073 | { |
074 | NSLog(@ "取消" ); |
075 | } |
076 |
077 | switch (buttonIndex) |
078 | { |
079 | case 0: //打开照相机拍照 |
080 | [self takePhoto]; |
081 | break ; |
082 |
083 | case 1: //打开本地相册 |
084 | [self LocalPhoto]; |
085 | break ; |
086 | } |
087 | } |
088 |
089 | //开始拍照 |
090 | -( void )takePhoto |
091 | { |
092 | UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera; |
093 | if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) |
094 | { |
095 | UIImagePickerController *picker = [[UIImagePickerController alloc] init]; |
096 | picker.delegate = self; |
097 | //设置拍照后的图片可被编辑 |
098 | picker.allowsEditing = YES; |
099 | picker.sourceType = sourceType; |
100 | [picker release]; |
101 | [self presentModalViewController:picker animated:YES]; |
102 | } else |
103 | { |
104 | NSLog(@ "模拟其中无法打开照相机,请在真机中使用" ); |
105 | } |
106 | } |
107 |
108 | //打开本地相册 |
109 | -( void )LocalPhoto |
110 | { |
111 | UIImagePickerController *picker = [[UIImagePickerController alloc] init]; |
112 |
113 | picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; |
114 | picker.delegate = self; |
115 | //设置选择后的图片可被编辑 |
116 | picker.allowsEditing = YES; |
117 | [self presentModalViewController:picker animated:YES]; |
118 | [picker release]; |
119 | } |
120 |
121 | //当选择一张图片后进入这里 |
122 | -( void )imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info |
123 |
124 | { |
125 |
126 | NSString *type = [info objectForKey:UIImagePickerControllerMediaType]; |
127 |
128 | //当选择的类型是图片 |
129 | if ([type isEqualToString:@ "public.image" ]) |
130 | { |
131 | //先把图片转成NSData |
132 | UIImage* image = [info objectForKey:@ "UIImagePickerControllerOriginalImage" ]; |
133 | NSData *data; |
134 | if (UIImagePNGRepresentation(image) == nil) |
135 | { |
136 | data = UIImageJPEGRepresentation(image, 1.0); |
137 | } |
138 | else |
139 | { |
140 | data = UIImagePNGRepresentation(image); |
141 | } |
142 |
143 | //图片保存的路径 |
144 | //这里将图片放在沙盒的documents文件夹中 |
145 | NSString * DocumentsPath = [NSHomeDirectory() stringByAppendingPathComponent:@ "Documents" ]; |
146 |
147 | //文件管理器 |
148 | NSFileManager *fileManager = [NSFileManager defaultManager]; |
149 |
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]; |
153 |
154 | //得到选择后沙盒中图片的完整路径 |
155 | filePath = [[NSString alloc]initWithFormat:@ "%@%@" ,DocumentsPath, @ "/image.png" ]; |
156 |
157 | //关闭相册界面 |
158 | [picker dismissModalViewControllerAnimated:YES]; |
159 |
160 | //创建一个选择后图片的小图标放在下方 |
161 | //类似微薄选择图后的效果 |
162 | UIImageView *smallimage = [[[UIImageView alloc] initWithFrame: |
163 | CGRectMake(50, 120, 40, 40)] autorelease]; |
164 |
165 | smallimage.image = image; |
166 | //加在视图中 |
167 | [self.view addSubview:smallimage]; |
168 |
169 | } |
170 |
171 | } |
172 |
173 | - ( void )imagePickerControllerDidCancel:(UIImagePickerController *)picker |
174 | { |
175 | NSLog(@ "您取消了选择图片" ); |
176 | [picker dismissModalViewControllerAnimated:YES]; |
177 | } |
178 |
179 | -( void )sendInfo |
180 | { |
181 | NSLog(@ "图片的路径是:%@" , filePath); |
182 |
183 | NSLog(@ "您输入框中的内容是:%@" , _textEditor.text); |
184 | } |
185 |
186 | - ( void )viewDidUnload |
187 | { |
188 | [super viewDidUnload]; |
189 | // Release any retained subviews of the main view. |
190 | } |
191 |
192 | - ( BOOL )shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation |
193 | { |
194 | return (interfaceOrientation == UIInterfaceOrientationPortrait); |
195 | } |
196 |
197 | @end |
如下图所示,打开下拉菜单按钮开始选择打开相机 或者 打开本地相册。模拟器中是无法打开照相机的的,切记。
如下图所示,这里就是我本地的相册啦,里面保存了几张图片,选择一张即可。
我在这里再说说图片上传, 图片上传我们采用的是2进制ASIHTTPRequest 来完成的。
发送请求
01 | NSString *server_base = [NSString stringWithFormat:@ "%@/users/uploadResource.json" , _server]; |
02 |
03 | ASINetworkQueue *queue = [[ASINetworkQueue alloc] init]; |
04 |
05 | ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:server_base]]; |
06 |
07 | [ASIHTTPRequest setShouldUpdateNetworkActivityIndicator: NO]; |
08 | [request setDelegate :self]; |
09 | [request setDidFinishSelector:@selector(sendCommentSucc:)]; |
10 | [request setDidFailSelector:@selector(sendCommentFail:)]; |
11 | // res 就是 需要上传图片文件的路径 |
12 | [request setFile:res forKey:@ "res" ]; |
13 |
14 | [queue addOperation:request]; |
15 | [queue go]; |
最后是文本的源码下载地址:
原文:http://blog.csdn.net/l_ch_g/article/details/11738129
相关:
http://www.cnblogs.com/skyblue/archive/2013/05/08/3067108.html