• 机试题:地图定位、拍照并显示、录制视频并播放


      这两天参加面试,有个公司先出了机试题,然后才能进入下一步,机试题大意是要求实现:地图定位、拍照并显示照片、录制视频并且播放视频三个小功能。

    先上我的效果图:

      

    1、地图定位关键代码(ios8后,开启地图定位需要在工程文件里面设置描述):

    //1、添加地图视图
        CGRect rect = [UIScreen mainScreen].bounds;
        _mapView = [[MKMapView alloc]initWithFrame:CGRectMake(0, 50, rect.size.width, rect.size.height - 50)];
        [self.view addSubview:_mapView];
        //设置代理
        _mapView.delegate = self;
        
        //2、请求定位服务
        _locationManager = [[CLLocationManager alloc]init];
        if(![CLLocationManager locationServicesEnabled]||[CLLocationManager authorizationStatus]!=kCLAuthorizationStatusAuthorizedWhenInUse){
            [_locationManager requestWhenInUseAuthorization];
        }
        
        //3、用户位置追踪
        _mapView.userTrackingMode = MKUserTrackingModeFollow;
        
        //4、设置地图类型
        _mapView.mapType = MKMapTypeStandard;
    View Code

    2、拍照和录制视频关键代码: 

    #import "ViewController.h"
    #import <MobileCoreServices/MobileCoreServices.h>
    #import <MediaPlayer/MediaPlayer.h>
    
    @interface ViewController () <UINavigationControllerDelegate, UIImagePickerControllerDelegate>
    
    @property (weak, nonatomic) IBOutlet UIImageView *imgView; //显示拍照的照片
    
    @property (strong, nonatomic) UIImagePickerController *picker;
    @property (assign, nonatomic) BOOL isChange; //是否切换拍照和录制视频
    @property (assign, nonatomic) NSInteger currentTag; //当前tag
    
    @property (nonatomic, strong) MPMoviePlayerController *moviePlayer;//视频播放控制器
    @property (nonatomic, strong) NSURL *movieUrl; //视频录制路径
    @property (nonatomic, strong) UIView *movieView; //播放器的View
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    //初始化picker
    - (UIImagePickerController *)picker{
        if (_isChange || _picker == nil){
            _picker = [[UIImagePickerController alloc]init];
            _picker.sourceType = UIImagePickerControllerSourceTypeCamera;//设置image picker的来源
            _picker.cameraDevice = UIImagePickerControllerCameraDeviceRear;//设置使用哪个摄像头,这里设置为后置摄像头
            
            if (self.currentTag == 1) { //录制视频
                _picker.mediaTypes = @[(NSString *)kUTTypeMovie];
                _picker.videoQuality = UIImagePickerControllerQualityTypeIFrame1280x720;
                _picker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo;//设置摄像头模式(拍照,录制视频)
                //NSLog(@"录制视频");
            }
            else{ //拍照
                _picker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
                //移除视频播放器控件
                if (self.moviePlayer != nil){
                    [self.movieView removeFromSuperview];
                    self.moviePlayer = nil;
                }
            }
            _picker.allowsEditing=YES;//允许编辑
            _picker.delegate=self;//设置代理,检测操作
        }
        return _picker;
    }
    
    //视频播放器
    -(MPMoviePlayerController *)moviePlayer{
        if (!_moviePlayer) {
            _moviePlayer = [MPMoviePlayerController new];
            _moviePlayer.view.frame = self.imgView.frame;
            _moviePlayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
            self.movieView = _moviePlayer.view;
            [self.view addSubview:self.movieView];
        }
        _moviePlayer.contentURL = self.movieUrl;
        
        return _moviePlayer;
    }
    
    //拍照和视频录制: tag = 0表示拍照,= 1表示录制视频
    - (IBAction)openVideo:(UIButton *)sender {
        
        if (self.currentTag != sender.tag) self.isChange = YES;
        
        self.currentTag = sender.tag;
        
        [self presentViewController:self.picker animated:YES completion:nil];
    }
    
    #pragma mark - 代理方法
    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
        NSString *mediaType=[info objectForKey:UIImagePickerControllerMediaType];
        
        if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {//当是拍照时
            UIImage *image;
            //如果允许编辑则获得编辑后的照片,否则获取原始照片
            if (self.picker.allowsEditing) {
                image = [info objectForKey:UIImagePickerControllerEditedImage];//获取编辑后的照片
            }else{
                image = [info objectForKey:UIImagePickerControllerOriginalImage];//获取原始照片
            }
            [self.imgView setImage:image];//显示照片
            //UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);//保存相片到相簿
        }
        else if([mediaType isEqualToString:(NSString *)kUTTypeMovie]){//当是录制视频时
            
            NSURL *url=[info objectForKey:UIImagePickerControllerMediaURL];//视频路径
            NSString *urlStr=[url path];
            
            //         //保存视频到相簿
            //        if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(urlStr)) {
            //            UISaveVideoAtPathToSavedPhotosAlbum(urlStr, self, nil, nil);//保存视频到相簿
            //        }
            self.movieUrl =[NSURL fileURLWithPath:urlStr];
            [self.moviePlayer play];
        }
        
        // 关闭照片选择器
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    View Code

    DEMO下载:

    github地址:https://github.com/xiaotanit/Tan_LocationPhotoVideo

    原文链接:http://www.cnblogs.com/tandaxia/p/5507154.html

  • 相关阅读:
    ASP.NET Core 中的 Razor Pages 介绍
    使用postman测试.net webservice接口
    vue.js页面打印window.print
    缓存策略汇总
    解决w3wp.exe内存占用过高的方法
    SqlServer 分库分表
    webform 回发或回调参数无效
    delphi unix时间戳 10位 13位 转换
    nt路径转dos windows路径
    PHP在linux下 连接MSSQL
  • 原文地址:https://www.cnblogs.com/tandaxia/p/5507154.html
Copyright © 2020-2023  润新知