如下图所示 在本地相册中选择一张图片后,我们将他拷贝至沙盒当中,在客户端中将它的缩略图放在按钮旁边,这个结构其实和新浪微薄中选择图片后的效果一样。最终点击发送将按钮将图片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