mzy123mzy

//这个方法可以实现照相和取图片功能

照相

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

                

                //支持照相功能

                

                [self loadImageWithType:UIImagePickerControllerSourceTypeCamera];

                

            }else {

 

                NSLog(@"抱歉,暂时不能照相");

                [self showMessage:@"不支持照相功能"];

                

            }

 

查看图片

[self loadImageWithType:UIImagePickerControllerSourceTypePhotoLibrary];

 

 

- (void)loadImageWithType:(UIImagePickerControllerSourceType)type {

    //创建UIImagePickerController对象

    UIImagePickerController *imagePC = [[UIImagePickerController alloc] init];

    //设置资源类型

    imagePC.sourceType = type;

    //设置是否支持后续操作  YES 支持  NO 不支持

    imagePC.allowsEditing = YES;

    //设置代理

    imagePC.delegate = self;

    //一般都采用模态视图跳转方式

    [self presentViewController:imagePC animated:YES completion:^{

        NSLog(@"跳转完成");

    }];

    

}

 

//点击choose完成按钮实现的方法

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {

    //info:里面包含所有信息

    NSLog(@"%@",info);

    //选取资源类型 这列是Medie类型

    NSString *type = [info objectForKey:UIImagePickerControllerMediaType];

    NSLog(@"type:%@",type);

    //判断当前图片是否是普通图片 (公共图片) public.image

    if ([type isEqualToString:@"public.image"]) {

        //如果后续操作是NO 就没有这个key:UIImagePickerControllerEditedImage

        //不管有没有后续操作 都可以取UIImagePickerControllerOriginalImage

        //选取图片 根据类型EditedImage 这个key得到图片image

        UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];

        

        _tableView.backgroundColor = [UIColor colorWithPatternImage:image];

        

    }

    

    //跳回去 必须要加 否则用户无法回到应用

    [picker dismissViewControllerAnimated:YES completion:^{

        

        NSLog(@"返回完成");

    }];

    

}

 

//点击cancel取消按钮执行这个方法

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {

    

    NSLog(@"取消");

    [picker dismissViewControllerAnimated:YES completion:^{

       

        NSLog(@"返回完成");

        

        [self showMessage:@"照相取消"];

        

    }];

}

 

 

- (void)showMessage:(NSString *)message {

    UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:message delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];

    [alerView show];

}

 

 

 

//加载视频的方法 根据路径

- (void)loadMovieWithPath:(NSString *)path {

    

    NSURL *url = nil;

    //判断是否是本地视频还是网络视频,如果路径前缀是http://或者https://开头 ,说明网络视频 否则是本地视频

    if ([path hasPrefix:@"http://"] || [path hasPrefix:@"https://"]) {

        //网络视频

        url = [NSURL URLWithString:path];

    }else {

        //本地视频

        url = [NSURL fileURLWithPath:path];

    }

    //根据url对象得到(创建)视频控制器对象

    _moviePlayerVC = [[MPMoviePlayerViewController alloc] initWithContentURL:url];

    //播放play 视图控制器对象没有播放方法 是里面(属性)的moviePlayer 去播放

    [_moviePlayerVC.moviePlayer play];

    //设置普通类型视频 (资源类型)

    _moviePlayerVC.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;

    

    //push跳转

    [self.navigationController pushViewController:_moviePlayerVC animated:YES];

}

 

//添加通知监听的方法

//添加通知监听视频的状态变化,视频播放需要使用通知来实现其状态变化,而不是通过协议代理的形式

- (void)addNoties {

    

    //视频播放状态改变的通知 MPMoviePlayerPlaybackStateDidChangeNotification

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerBackStateChange:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:_player];

    //视频播放完成后的通知

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:_player];

}

//视频状态改变

- (void)playerBackStateChange:(NSNotification *)noti {

    //noti的object属性 得到视频控制对象

    MPMoviePlayerController *currentPlayer = noti.object;

    switch (currentPlayer.playbackState) {

        case MPMoviePlaybackStatePlaying:

        {

            NSLog(@"播放中");

        }

            break;

        case MPMoviePlaybackStatePaused:

        {

            NSLog(@"暂停");

        }

            break;

        case MPMoviePlaybackStateInterrupted:

        {

            NSLog(@"中断");

        }

            break;

        case MPMoviePlaybackStateSeekingForward:

        {

            NSLog(@"快进");

        }

            break;

        case MPMoviePlaybackStateSeekingBackward:

        {

            NSLog(@"后退");

        }

            break;

        case MPMoviePlaybackStateStopped:

        {

            NSLog(@"停止");

        }

            break;

            

        default:

            break;

    }

}

 

 

 

 

 

自定义播放视频

//创建并播放的方法

- (void)createAndPlay {

    //在实际开发中,每次播放一个视频,先使播放器对象为空,以保证每次进入这个方法后,开始新的视频(新的内存)播放

    _player = nil;

    

    //获取视频文件路径

    NSString *strPath = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"mp4"];

    //得到url对象

    NSURL *url = [NSURL fileURLWithPath:strPath];

    //初始化视频播放器对象

    _player = [[MPMoviePlayerController alloc] initWithContentURL:url];

    //设置播放器的播放视图位置以及大小

    _player.view.frame = CGRectMake(0, 200, self.view.frame.size.width, 300);

    //将播放视图添加到父视图self.view上

    [self.view addSubview:_player.view];

    

    /*

     

     MPMovieControlStyleNone,

     MPMovieControlStyleEmbedded,     

     MPMovieControlStyleFullscreen,

     MPMovieControlStyleDefault

     */

    //在实际开发中,需要定制自己的播放按钮、快进 慢退等等,则必须先隐藏系统自带的空间 需要设置controlStyle属性  类型None

    _player.controlStyle = MPMovieControlStyleFullscreen;

    

    //播放

    [_player play];

    

}

 

播放音乐

- (void)viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];

    //当视图将要消失的时候 停止播放

    [self stopMusic];

}

 

//配置支持后台播放的方法

- (void)configBackPlay {

    

    //[AVAudioSession sharedInstance] 创建单例对象audioSession会话对象

    //设置音频会话种类 AVAudioSessionCategoryPlayback 音频播放种类 设置此类告诉系统禁止其他音频播放器

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

    //激活音频会话对象

    [[AVAudioSession sharedInstance] setActive:YES error:nil];

    

    //注意:在此处配置只是后台播放配置步骤之一,千忘别忘了需要在info.plist文件增加其属性置顶

}

 

 

//初始化UI

- (void)initUI {

    //将持续时间设置到mySlider的maximumValue的属性上

    self.mySlider.maximumValue = _audioPlayer.duration;

    //currentTime:当前进度(当前时间)

    self.mySlider.value = _audioPlayer.currentTime;

 

    //value值方法改变的时候响应sliderMethod:这个方法

    [self.mySlider addTarget:self action:@selector(sliderMethod:) forControlEvents:UIControlEventValueChanged];

    //当在insider(里面)抬起的时候调用stopTouchSlider:这个方法

    [self.mySlider addTarget:self action:@selector(stopTouchSlider:) forControlEvents:UIControlEventTouchUpInside];

}

//按住滑块的时候执行

- (void)sliderMethod:(UISlider *)slider {

    //定时器停止 设置一个未来时间就停止定时器

    [_timer setFireDate:[NSDate distantFuture]];

    //暂停音乐

    [_audioPlayer pause];

    //修改按钮的标题-播放  (可选)

    [self.myButton setTitle:@"播放" forState:UIControlStateNormal];

    //音乐的进度随着slider的值改变

    _audioPlayer.currentTime = (double)slider.value;

}

 

//抬起的时候执行

- (void)stopTouchSlider:(UISlider *)slider {

    //开启定时器 设置当前时间就启动定时器

    [_timer setFireDate:[NSDate date]];

    //播放

    [_audioPlayer play];

    //修改按钮的标题-暂停

    [self.myButton setTitle:@"暂停" forState:UIControlStateNormal];

    

}

 

 

//初始化定时器

- (void)initTimer {

    

    _timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(valueChanged:) userInfo:_mySlider repeats:YES];

}

 

- (void)valueChanged:(NSTimer *)timer {

    //0.2秒就会改变self.mySlider的进度值

    self.mySlider.value = _audioPlayer.currentTime;

}

 

 

//播放当前音乐  参数判断是否是第一次进来 如果是 不让它播放

- (void)playCurrentMusic:(BOOL)isFirst {

    

    //初始化音乐播放器对象 第一个参数url对象 直接从可变数中取

    _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:arrPlayDataSource[currentPlayIndex] error:nil];

    //准备播放

    [_audioPlayer prepareToPlay];

    if (isFirst) {

        NSLog(@"是第一次进来");

    }else {

        //播放

        [_audioPlayer play];

        

        [self.myButton setTitle:@"暂停" forState:UIControlStateNormal];

        

    }

    //设置播放次数

    //-1 设置任何负数都表示无限循环播放 直到手动停止播放  0:代表播放1次  1:播放2次

    _audioPlayer.numberOfLoops = -1;

    //设置代理

    _audioPlayer.delegate = self;

    

    

}

 

//初始化列表数据源

- (void)initPlayList {

    

    //这个是查询项目中所有mp3个格式的音频文件,返回放入到数组中,第二个参数是子目录默认为空

    NSArray *arrTemp = [[NSBundle mainBundle] URLsForResourcesWithExtension:@"mp3" subdirectory:nil];

    NSLog(@"%@",arrTemp);

    //将获取的url路径 填入数据源(可变数据),就是不可数组放入到可变数组中

    arrPlayDataSource = [[NSMutableArray alloc] initWithArray:arrTemp];

    currentPlayIndex = 0;  //初始化设置第一条开始播放 (0下标)

    

}

 

 

- (IBAction)click:(id)sender {

    

    UIButton *myButton = sender;

    NSLog(@"tag:%ld",myButton.tag);

    switch (myButton.tag) {

        case 100:

        {

            //上一首

            [self previousMusic];

            

        }

            break;

        case 200:

        {

            //判断播放器对象是否为空 需要重新申请内存空间 然后播放

            if (_audioPlayer == nil) {

                //播放音乐

                [self playCurrentMusic:NO];

                //跳槽swich

                break;

            }

            //判断播放器对象是否在播放 isPlaying如果真 说明正在播放 否则不播放

            if (_audioPlayer.isPlaying) {

                //暂停音乐

                [_audioPlayer pause];

                

                [myButton setTitle:@"播放" forState:UIControlStateNormal];

                //停止定时器

                [_timer setFireDate:[NSDate distantFuture]];

                NSLog(@"未来的时间:%@",[NSDate distantFuture]);

                

            }else {

                //播放音乐

                [_audioPlayer play];

                [myButton setTitle:@"暂停" forState:UIControlStateNormal];

                //启动定时器

                [_timer setFireDate:[NSDate date]];

                NSLog(@"当前时间:%@",[NSDate date]);

                

            }

            

        }

            break;

        case 300:

        {

            //下一首

            [self nextMusic];

            

        }

            break;

        case 400:

        {

            //停止

            [self stopMusic];

            

        }

            break;

        default:

            break;

    }

    

}

 

//下一首

- (void)nextMusic {

    //先停止当前音乐播放

    [self stopMusic];

    

    //改索引

    currentPlayIndex++;

    //必须要判断 为了防止超出数组的范围,超出就会崩溃

    if (currentPlayIndex >= arrPlayDataSource.count) {

        currentPlayIndex = 0;  //如果超过了数组范围,让索引值为0 就是从头开始

    }

    //播放当前音乐

    [self playCurrentMusic:NO];

}

 

//上一首

- (void)previousMusic {

    

    //先停止当前音乐播放

    [self stopMusic];

    //改变索引

    currentPlayIndex--;

    //必须要加判断 如果不加判断会导致索引值为负数,会导致崩溃

    if (currentPlayIndex < 0) {

        //如果是负数 让索引到数组中最后一首歌曲

        currentPlayIndex =  (int)arrPlayDataSource.count - 1;

    }

    //播放当前音乐

    [self playCurrentMusic:NO];

    

}

 

//停止音乐的方法

- (void)stopMusic {

    //停止音频播放 调用stop方法

    [_audioPlayer stop];

    //将播放器对象设置为空,防止每次调用上面playerCurrentMusci这个方法每次都alloc 会不断申请内存,这个设置nil 释放一下内存空间

    _audioPlayer = nil;

    

    [self.myButton setTitle:@"播放" forState:UIControlStateNormal];

    

}

 

分类:

技术点:

相关文章: