如下图所示 在本地相册中选择一张图片后,我们将他拷贝至沙盒当中,在客户端中将它的缩略图放在按钮旁边,这个结构其实和新浪微薄中选择图片后的效果一样。最终点击发送将按钮将图片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 = @ "请输入内容" ; |
033 | [_textEditor becomeFirstResponder]; |
036 | [self.view addSubview:_textEditor]; |
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); |
145 | NSString * DocumentsPath = [NSHomeDirectory() stringByAppendingPathComponent:@ "Documents" ]; |
148 | NSFileManager *fileManager = [NSFileManager defaultManager]; |
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]; |
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