zoukankan      html  css  js  c++  java
  • IOS研究院之打开照相机与本地相册选择图片(六)

    原创文章如需转载请注明:转载自雨松MOMO程序研究院本文链接地址:IOS研究院之打开照相机与本地相册选择图片(六)

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

     

     

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

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

    #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

    #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 注意这里面引入了很多代理类。

    #import <UIKit/UIKit.h>
    
    @interface TestViewController : UIViewController<UITextViewDelegate,UIActionSheetDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate>
    {
        //输入框
        UITextView *_textEditor;
    
        //下拉菜单
        UIActionSheet *myActionSheet;
    
        //图片2进制路径
        NSString* filePath;
    }
    @end

     

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

    #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)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

     

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

     

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

     

     

     

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

    发送请求

     

        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点多了。。。

    下载地址:http://vdisk.weibo.com/s/accm9

  • 相关阅读:
    Transition 过渡/转场动画(一)
    动态创建类/ swizzle class
    Protocol协议分发器
    UITableView 支持左右滑动(二)
    UITableView 支持左右滑动(一)
    CATiledLayer显示超大图片的解决方案
    ReplicatorLayer 复制图层
    iOS OpenGL ES简单绘制纹理
    iOS OpenGL ES简单绘制三角形
    Mac定时执行脚本_服务launchctl
  • 原文地址:https://www.cnblogs.com/lixingle/p/3707721.html
Copyright © 2011-2022 走看看