文章出處
文章列表
如下圖所示 在本地相冊中選擇一張圖片后,我們將他拷貝至沙盒當中,在客戶端中將它的縮略圖放在按鈕旁邊,這個結構其實和新浪微薄中選擇圖片后的效果一樣。最終點擊發送將按鈕將圖片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://vdisk.weibo.com/s/accm9
原文:http://blog.csdn.net/l_ch_g/article/details/11738129
相關:
ios中攝像頭/相冊獲取圖片,壓縮圖片,上傳服務器方法總結
http://www.cnblogs.com/skyblue/archive/2013/05/08/3067108.html
文章列表
全站熱搜