如何快速调用系统相机


#pragma mark -选取照片
- (IBAction)updatePhoto:(id)sender {
    UIAlertController * alertCon  =[UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
    UIAlertAction * action1 = [UIAlertAction actionWithTitle:@"打开照相机" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {
        UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;
        if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]){
            UIImagePickerController *picker = [[UIImagePickerController alloc] init];
            picker.delegate = self;
            picker.allowsEditing = YES;
            picker.sourceType = sourceType;
            [self presentViewController:picker animated:YES completion:nil];
        }else{
            NSLog(@"模拟其中无法打开照相机,请在真机中使用");
        }
    }];
    UIAlertAction * action2 = [UIAlertAction actionWithTitle:@"从手机相册获取" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {
        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
        picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        picker.delegate = self;
        picker.allowsEditing = YES;
        [self presentViewController:picker animated:YES completion:nil];
    }];
    UIAlertAction * action3 = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
    }];
    [alertCon addAction:action1];
    [alertCon addAction:action2];
    [alertCon addAction:action3];
    [self presentViewController:alertCon animated:YES completion:^{
    }];
}


Hello 大家好 IOS的文章好久都木有更新了,今天更新一篇哈。 这篇文章主要学习如何在IOS程序中打开照相机与本地相册并且选择一张图片。还是老样子MOMO写了一个简单的测试程序,如下图所示 在本地相册中选择一张图片后,我们将他拷贝至沙盒当中,在客户端中将它的缩略图放在按钮旁边,这个结构其实和新浪微薄中选择图片后的效果一样。最终点击发送将按钮将图片2进制图片上传服务器。

 

IOS研究院之打开照相机与本地相册选择图片(六) - 雨松MOMO程序研究院 - 1

 

下面我们仔细学习具体的细节。创建一个空的IOS项目,接着在创建一个ViewController。

AppDelegate.h 应用的代理类 这个没什么好说的就是直接打开刚刚创建的新ViewController。

1
2
3
4
5
6
7
8
9
#import <UIKit/UIKit.h>
#import "TestViewController.h"
 
@ interface AppDelegate : UIResponder < UIApplicationDelegate >
 
@ property ( strong , nonatomic ) UIWindow * window ;
@ property ( strong , nonatomic ) UINavigationController * navController ;
@ property ( strong , nonatomic ) UIViewController * viewController ;
@ end

 

AppDelegate.m 在这里就是打开我们创建的TestViewController

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#import "AppDelegate.h"
 
@ implementation AppDelegate
 
@ synthesize window = _window ;
@ synthesize navController ;
@ synthesize viewController ;
 
- ( void ) dealloc
{
     [ _window release ] ;
     [ super dealloc ] ;
}
 
- ( BOOL ) application : ( UIApplication * ) application didFinishLaunchingWithOptions : ( NSDictionary * ) launchOptions
{
     self . window = [ [ [ UIWindow alloc ] initWithFrame : [ [ UIScreen mainScreen ] bounds ] ] autorelease ] ;
 
     self . window . backgroundColor = [ UIColor whiteColor ] ;
     self . viewController =    [ [ TestViewController alloc ] init ] ;
     self . navController = [ [ UINavigationController alloc ] initWithRootViewController : self . viewController ] ;
     [ self . window addSubview : navController . view ] ;
 
     [ self . window makeKeyAndVisible ] ;
     return YES ;
}
 
@ end

 

TestViewController.h 注意这里面引入了很多代理类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#import <UIKit/UIKit.h>
 
@ interface TestViewController : UIViewController < UITextViewDelegate , UIActionSheetDelegate , UINavigationControllerDelegate , UIImagePickerControllerDelegate >
{
     //输入框
     UITextView * _textEditor ;
 
     //下拉菜单
     UIActionSheet * myActionSheet ;
 
     //图片2进制路径
     NSString * filePath ;
}
@ end

 

TestViewController.m 请大家仔细看这个类, 所有的东西都写在了这里哈。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#import "TestViewController.h"
 
@ interface  TestViewController  ( )
 
@ end
 
@ implementation  TestViewController
 
-  ( void ) viewDidLoad
{
    [ super  viewDidLoad ] ;
    //导航栏标题
self . navigationItem . title  =  @"雨松MOMO输入框" ;
 
    //导航栏按钮
    self . navigationItem . rightBarButtonItem  =  [ [ [ UIBarButtonItem  alloc ]
                                                initWithTitle :  @"发送"
                                                style :  UIBarButtonItemStyleDone
                                                target :  self
                                                action :  @ selector ( sendInfo ) ]  autorelease ] ;
 
    //输入框显示区域
    _textEditor  =  [ [ UITextView  alloc ]  initWithFrame : CGRectMake ( 0 ,  0 ,  320 ,  100 ) ] ;
    //设置它的代理
    _textEditor . delegate  =  self ;
    _textEditor . autoresizingMask  =  UIViewAutoresizingFlexibleWidth ;
    _textEditor . keyboardType  =  UIKeyboardTypeDefault ;
    _textEditor . font  =  [ UIFont  systemFontOfSize : 20 ] ;
    _textEditor . text  =  @"请输入内容" ;
 
    //默认软键盘是在触摸区域后才会打开
    //这里表示进入当前ViewController直接打开软键盘
    [ _textEditor  becomeFirstResponder ] ;
 
    //把输入框加在视图中
    [ self . view  addSubview : _textEditor ] ;
 
    //下方的图片按钮 点击后呼出菜单 打开摄像机 查找本地相册
    UIImage  * image  =  [ [ UIImage  alloc ]  initWithContentsOfFile : [ [ NSBundle  mainBundle ]  pathForResource : @"camera"  ofType : @"png" ] ] ;
 
    UIButton  * button  =  [ UIButton  buttonWithType : UIButtonTypeCustom ] ;
    button . frame  =  CGRectMake ( 0 ,  120 ,  image . size . width ,  image . size . height ) ;
 
    [ button  setImage : image  forState : UIControlStateNormal ] ;
 
    [ button  addTarget : self  action : @ selector ( openMenu )  forControlEvents : UIControlEventTouchUpInside ] ;
 
    //把它也加在视图当中
    [ self . view  addSubview : button ] ;
 
}
 
- ( void ) openMenu
{
    //在这里呼出下方菜单按钮项
    myActionSheet  =  [ [ UIActionSheet  alloc ]
                  initWithTitle : nil
                  delegate : self
                  cancelButtonTitle : @"取消"
                  destructiveButtonTitle : nil
                  otherButtonTitles :  @"打开照相机" ,  @"从手机相册获取" , nil ] ;  
 
    [ myActionSheet  showInView : self . view ] ;
    [ myActionSheet  release ] ;    
 
}
 
-  ( void ) actionSheet : ( UIActionSheet  * ) actionSheet  clickedButtonAtIndex : ( NSInteger ) buttonIndex
{
 
    //呼出的菜单按钮点击后的响应
    if  ( buttonIndex  ==  myActionSheet . cancelButtonIndex )
    {
        NSLog ( @"取消" ) ;
    }
 
    switch  ( buttonIndex )
    {
        case  0 :   //打开照相机拍照
            [ self  takePhoto ] ;
            break ;
 
        case  1 :   //打开本地相册
            [ self  LocalPhoto ] ;
            break ;
    }
}
 
//开始拍照
//-(void)takePhoto
//{
//    UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;
//    if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera])
//    {
//        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
//        picker.delegate = self;
//        // 设置拍照后的图片可被编辑
//        picker.allowsEditing = YES;
//        picker.sourceType = sourceType;
//        [picker release];
//        [self presentModalViewController:picker animated:YES];
//    }else
//    {
//        NSLog(@" 模拟其中无法打开照相机 , 请在真机中使用 ");
//    }
//}
  -(void)takePhoto
{
UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera; 
if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) 
{
UIImagePickerController *pickerCammer = [[UIImagePickerController alloc] init];
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
pickerCammer.sourceType = UIImagePickerControllerSourceTypeCamera;
pickerCammer.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:pickerCammer.sourceType];
pickerCammer.delegate=self;
pickerCammer.allowsEditing = YES;

}
[self presentModalViewController:pickerCammer animated:YES];
[pickerCammer release];

}else 
{
NSLog(@"模拟其中无法打开照相机,请在真机中使用");
}  
}
//打开本地相册
- ( void ) LocalPhoto
{
    UIImagePickerController  * picker  =  [ [ UIImagePickerController  alloc ]  init ] ;
 
    picker . sourceType  =  UIImagePickerControllerSourceTypePhotoLibrary ;
    picker . delegate  =  self ;
    //设置选择后的图片可被编辑
    picker . allowsEditing  =  YES ;
    [ self  presentModalViewController : picker  animated : YES ] ;
    [ picker  release ] ;
}
 
//当选择一张图片后进入这里
- ( void ) imagePickerController : ( UIImagePickerController * ) picker  didFinishPickingMediaWithInfo : ( NSDictionary  * ) info
 
{
 
    NSString  * type  =  [ info  objectForKey : UIImagePickerControllerMediaType ] ;
 
    //当选择的类型是图片
    if  ( [ type  isEqualToString : @"public.image" ] )
    {
        //先把图片转成NSData
        UIImage *  image  =  [ info  objectForKey : @"UIImagePickerControllerOriginalImage" ] ;
        NSData  * data ;
        if  ( UIImagePNGRepresentation ( image )  ==  nil )
        {
            data  =  UIImageJPEGRepresentation ( image ,  1.0 ) ;
        }
        else
        {
            data  =  UIImagePNGRepresentation ( image ) ;
        }
 
        //图片保存的路径
        //这里将图片放在沙盒的documents文件夹中
        NSString  *  DocumentsPath  =  [ NSHomeDirectory ( )  stringByAppendingPathComponent : @"Documents" ] ;  
 
        //文件管理器
        NSFileManager  * fileManager  =  [ NSFileManager  defaultManager ] ;
 
        //把刚刚图片转换的data对象拷贝至沙盒中 并保存为image.png
        [ fileManager  createDirectoryAtPath : DocumentsPath  withIntermediateDirectories : YES  attributes : nil  error : nil ] ;
        [ fileManager  createFileAtPath : [ DocumentsPath  stringByAppendingString : @"/image.png" ]  contents : data  attributes : nil ] ;
 
        //得到选择后沙盒中图片的完整路径
        filePath  =  [ [ NSString  alloc ] initWithFormat : @"%@%@" , DocumentsPath ,   @"/image.png" ] ;
 
        //关闭相册界面
        [ picker  dismissModalViewControllerAnimated : YES ] ;
 
        //创建一个选择后图片的小图标放在下方
        //类似微薄选择图后的效果
        UIImageView  * smallimage  =  [ [ [ UIImageView  alloc ]  initWithFrame :
                                    CGRectMake ( 50 ,  120 ,  40 ,  40 ) ]  autorelease ] ;    
 
        smallimage . image  =  image ;
        //加在视图中
        [ self . view  addSubview : smallimage ] ;
 
    }
 
}
 
-  ( void ) imagePickerControllerDidCancel : ( UIImagePickerController  * ) picker
{
    NSLog ( @"您取消了选择图片" ) ;
    [ picker  dismissModalViewControllerAnimated : YES ] ;
}
 
- ( void ) sendInfo
{
    NSLog ( @"图片的路径是:%@" ,  filePath ) ;
 
    NSLog ( @"您输入框中的内容是:%@" ,  _textEditor . text ) ;
}
 
-  ( void ) viewDidUnload
{
    [ super  viewDidUnload ] ;
    // Release any retained subviews of the main view.
}
 
-  ( BOOL ) shouldAutorotateToInterfaceOrientation : ( UIInterfaceOrientation ) interfaceOrientation
{
    return  ( interfaceOrientation  ==  UIInterfaceOrientationPortrait ) ;
}
 
@ end

 

如下图所示,打开下拉菜单按钮开始选择打开相机 或者 打开本地相册。模拟器中是无法打开照相机的的,切记。

IOS研究院之打开照相机与本地相册选择图片(六) - 雨松MOMO程序研究院 - 2

 

如下图所示,这里就是我本地的相册啦,里面保存了几张图片,选择一张即可。

 

IOS研究院之打开照相机与本地相册选择图片(六) - 雨松MOMO程序研究院 - 3

 

 

我在这里再说说图片上传, 图片上传我们采用的是2进制ASIHTTPRequest 来完成的。

发送请求

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
     NSString * server_base = [ NSString stringWithFormat : @"%@/users/uploadResource.json" , _server ] ;
 
     ASINetworkQueue * queue = [ [ ASINetworkQueue alloc ] init ] ;   
 
     ASIFormDataRequest * request = [ ASIFormDataRequest requestWithURL : [ NSURL URLWithString : server_base ] ] ;
 
     [ ASIHTTPRequest setShouldUpdateNetworkActivityIndicator : NO ] ;
     [ request setDelegate : self ] ;
     [ request setDidFinishSelector : @ selector ( sendCommentSucc : ) ] ;
     [ request setDidFailSelector : @ selector ( sendCommentFail : ) ] ;
     // res 就是 需要上传图片文件的路径
     [ request setFile : res forKey : @"res" ] ;
 
     [ queue addOperation : request ] ;
     [ queue go ] ;

 

最后是文本的源码,雨松MOMO祝大家学习愉快,不早了,我也得睡觉啦,1点多了。。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值