天天看點

IOS研究院之打開照相機與本地相冊選擇圖檔

如下圖所示 在本地相冊中選擇一張圖檔後,我們将他拷貝至沙盒當中,在用戶端中将它的縮略圖放在按鈕旁邊,這個結構其實和新浪微薄中選擇圖檔後的效果一樣。最終點選發送将按鈕将圖檔2進制圖檔上傳伺服器。

IOS研究院之打開照相機與本地相冊選擇圖檔

下面我們仔細學習具體的細節。建立一個空的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

如下圖所示,打開下拉菜單按鈕開始選擇打開相機 或者 打開本地相冊。模拟器中是無法打開照相機的的,切記。

IOS研究院之打開照相機與本地相冊選擇圖檔

如下圖所示,這裡就是我本地的相冊啦,裡面儲存了幾張圖檔,選擇一張即可。

IOS研究院之打開照相機與本地相冊選擇圖檔

我在這裡再說說圖檔上傳, 圖檔上傳我們采用的是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