我无法通过带定时器的 circularProgressBar 长按按钮录制音频。启动应用程序时按钮被禁用
I am not able to record audio by longpress button with circularProgressBar with timer. button is disabled while launch of application
---你好,我是 objective C 的新手。我无法在按下下面列出的 buttonTapped 方法时录制音频 - buttontapped 在应用程序启动时被禁用,因此我无法录制,因此我无法播放录制的声音。请指导这个。
--这是我的文件。
-- 我从 github 导入了两个 CircularProgressBarTimer 文件,并将这些文件导入到 .h 文件中。
----这是我的.h文件
@interface ViewController : UIViewController<AVAudioRecorderDelegate,AVAudioPlayerDelegate,UIGestureRecognizerDelegate>{
NSTimer *timer;
NSInteger globalTimer;
NSInteger counter;
NSInteger minutesLeft;
NSInteger secondsLeft;
UIRefreshControl *refreshControl;
CircularProgressTimer *progressTimerView;
}
@property (weak, nonatomic) IBOutlet UIButton *buttonRecord;
@property (strong, nonatomic) IBOutlet UILongPressGestureRecognizer *longpressGesture;
@property (weak, nonatomic) IBOutlet CircularProgressTimer *circularProgressView;
- (IBAction)buttonTapped:(id)sender;
-(void)longPressed:(UIGestureRecognizer *)longPress;
这是我的 .m 文件
@interface ViewController (){
AVAudioRecorder *recorder;
AVAudioPlayer *player;
}
@end
--在我的 viewDidLoad 方法中,我初始化了音频播放器 Longesturerecognizer
@implementation ViewController
@synthesize buttonRecord;
@synthesize longpressGesture;
@synthesize circularProgressView;
- (void)viewDidLoad {
[super viewDidLoad];
UILongPressGestureRecognizer *gesture1 = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressed:)];
gesture1.delegate =self;
[gesture1 setMinimumPressDuration:(NSTimeInterval)10];
[self.buttonRecord addGestureRecognizer:gesture1];
//Set the audio file
NSArray *pathComponents =[NSArray arrayWithObjects:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject],@"MyAudioDemo.m4a", nil];
NSURL *outputFileURL =[NSURL fileURLWithPathComponents:pathComponents];
//Set the audio Session
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
//Define the recorder Setting
NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc]init];
[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
[recordSetting setValue:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];
[recordSetting setValue :[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
[recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
[recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];
//Initiate and prepare the recorder
recorder=[[AVAudioRecorder alloc]initWithURL:outputFileURL settings:recordSetting error:nil];
recorder.delegate=self;
recorder.meteringEnabled =YES;
[recorder prepareToRecord];
//Disable play button when application launches
[buttonRecord setEnabled:NO];
}
---而且我已经定义了关于大小分配的循环进度条方法。
- (void)drawCircularProgressBarWithMinutesLeft:(NSInteger)minutes secondsLeft:(NSInteger)seconds
{
// Removing unused view to prevent them from stacking up
for (id subView in [self.view subviews]) {
if ([subView isKindOfClass:[CircularProgressTimer class]]) {
[subView removeFromSuperview];
}
}
// Init our view and set current circular progress bar value
CGRect progressBarFrame = CGRectMake(0, 0, 180, 180);
progressTimerView = [[CircularProgressTimer alloc] initWithFrame:progressBarFrame];
[progressTimerView setCenter:CGPointMake(160, 210)];
[progressTimerView setPercent:seconds];
if (/*minutes == 0 &&*/ seconds == 0) {
[progressTimerView setInstanceColor:[UIColor redColor]];
}
// Here, setting the minutes left before adding it to the parent view
//[progressTimerView setMinutesLeft:minutesLeft];
[progressTimerView setSecondsLeft:secondsLeft];
[self.view addSubview:progressTimerView];
progressTimerView = nil;
}
- (void)startTimer
{
timer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(updateCircularProgressBar)
userInfo:nil
repeats:YES];
}
- (void)updateCircularProgressBar
{
// Values to be passed on to Circular Progress Bar
if (globalTimer > 0 && globalTimer <= 1200) {
globalTimer--;
// minutesLeft = globalTimer / 60;
secondsLeft = globalTimer % 43;
[self drawCircularProgressBarWithMinutesLeft:minutesLeft secondsLeft:secondsLeft];
NSLog(@"Time left:%02ld", (long)secondsLeft);
} else {
[self drawCircularProgressBarWithMinutesLeft:0 secondsLeft:0];
[timer invalidate];
}
}
- (void)remoteControlReceivedWithEvent:(UIEvent *)event{
switch (event.subtype) {
case UIEventSubtypeRemoteControlPause:
[self.circularProgressView pause];
break;
case UIEventSubtypeRemoteControlPlay:
[self.circularProgressView play];
default:
break;
}
}
- (BOOL)shouldAutorotate{
return YES;
}
----我知道我在 buttonRecord 事件中做错了代码。但是当我调试应用程序时,按钮被禁用并且无法按下。请指导我,我将不胜感激。
- (IBAction)buttonTapped:(id)sender {
if (player.playing) {
[player stop];
}
if (!recorder.recording) {
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setActive:YES error:nil];
// Start recording
[recorder record];
[buttonRecord setTitle:@"Pause" forState:UIControlStateNormal];
} else {
// Pause recording
[recorder pause];
[buttonRecord setTitle:@"Record" forState:UIControlStateNormal];
}
//[stopButton setEnabled:YES];
[_playButton setEnabled:NO];
timer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(updateCircularProgressBar)
userInfo:nil
repeats:YES];
NSLog(@"playTapped");
if (!recorder.recording) {
player =[[AVAudioPlayer alloc]initWithContentsOfURL:recorder.url error:nil];
//[player setDelegate:self];
[buttonRecord setEnabled:YES];
[recorder recordForDuration:(NSTimeInterval)10];
[recorder record];
}
}
- (IBAction)playbuttontTapped:(id)sender {
if (!recorder.recording){
player = [[AVAudioPlayer alloc] initWithContentsOfURL:recorder.url error:nil];
[player setDelegate:self];
[player play];
}}
你 viewDidLoad
中的最后一行导致你的记录按钮被禁用,你为什么要添加这个 [buttonRecord setEnabled:NO];
您可以尝试将其更改为 [buttonRecord setEnabled:YES];
或完全删除该行
---你好,我是 objective C 的新手。我无法在按下下面列出的 buttonTapped 方法时录制音频 - buttontapped 在应用程序启动时被禁用,因此我无法录制,因此我无法播放录制的声音。请指导这个。
--这是我的文件。
-- 我从 github 导入了两个 CircularProgressBarTimer 文件,并将这些文件导入到 .h 文件中。
----这是我的.h文件
@interface ViewController : UIViewController<AVAudioRecorderDelegate,AVAudioPlayerDelegate,UIGestureRecognizerDelegate>{
NSTimer *timer;
NSInteger globalTimer;
NSInteger counter;
NSInteger minutesLeft;
NSInteger secondsLeft;
UIRefreshControl *refreshControl;
CircularProgressTimer *progressTimerView;
}
@property (weak, nonatomic) IBOutlet UIButton *buttonRecord;
@property (strong, nonatomic) IBOutlet UILongPressGestureRecognizer *longpressGesture;
@property (weak, nonatomic) IBOutlet CircularProgressTimer *circularProgressView;
- (IBAction)buttonTapped:(id)sender;
-(void)longPressed:(UIGestureRecognizer *)longPress;
这是我的 .m 文件
@interface ViewController (){
AVAudioRecorder *recorder;
AVAudioPlayer *player;
}
@end
--在我的 viewDidLoad 方法中,我初始化了音频播放器 Longesturerecognizer
@implementation ViewController
@synthesize buttonRecord;
@synthesize longpressGesture;
@synthesize circularProgressView;
- (void)viewDidLoad {
[super viewDidLoad];
UILongPressGestureRecognizer *gesture1 = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressed:)];
gesture1.delegate =self;
[gesture1 setMinimumPressDuration:(NSTimeInterval)10];
[self.buttonRecord addGestureRecognizer:gesture1];
//Set the audio file
NSArray *pathComponents =[NSArray arrayWithObjects:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject],@"MyAudioDemo.m4a", nil];
NSURL *outputFileURL =[NSURL fileURLWithPathComponents:pathComponents];
//Set the audio Session
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
//Define the recorder Setting
NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc]init];
[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
[recordSetting setValue:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];
[recordSetting setValue :[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
[recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
[recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];
//Initiate and prepare the recorder
recorder=[[AVAudioRecorder alloc]initWithURL:outputFileURL settings:recordSetting error:nil];
recorder.delegate=self;
recorder.meteringEnabled =YES;
[recorder prepareToRecord];
//Disable play button when application launches
[buttonRecord setEnabled:NO];
}
---而且我已经定义了关于大小分配的循环进度条方法。
- (void)drawCircularProgressBarWithMinutesLeft:(NSInteger)minutes secondsLeft:(NSInteger)seconds
{
// Removing unused view to prevent them from stacking up
for (id subView in [self.view subviews]) {
if ([subView isKindOfClass:[CircularProgressTimer class]]) {
[subView removeFromSuperview];
}
}
// Init our view and set current circular progress bar value
CGRect progressBarFrame = CGRectMake(0, 0, 180, 180);
progressTimerView = [[CircularProgressTimer alloc] initWithFrame:progressBarFrame];
[progressTimerView setCenter:CGPointMake(160, 210)];
[progressTimerView setPercent:seconds];
if (/*minutes == 0 &&*/ seconds == 0) {
[progressTimerView setInstanceColor:[UIColor redColor]];
}
// Here, setting the minutes left before adding it to the parent view
//[progressTimerView setMinutesLeft:minutesLeft];
[progressTimerView setSecondsLeft:secondsLeft];
[self.view addSubview:progressTimerView];
progressTimerView = nil;
}
- (void)startTimer
{
timer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(updateCircularProgressBar)
userInfo:nil
repeats:YES];
}
- (void)updateCircularProgressBar
{
// Values to be passed on to Circular Progress Bar
if (globalTimer > 0 && globalTimer <= 1200) {
globalTimer--;
// minutesLeft = globalTimer / 60;
secondsLeft = globalTimer % 43;
[self drawCircularProgressBarWithMinutesLeft:minutesLeft secondsLeft:secondsLeft];
NSLog(@"Time left:%02ld", (long)secondsLeft);
} else {
[self drawCircularProgressBarWithMinutesLeft:0 secondsLeft:0];
[timer invalidate];
}
}
- (void)remoteControlReceivedWithEvent:(UIEvent *)event{
switch (event.subtype) {
case UIEventSubtypeRemoteControlPause:
[self.circularProgressView pause];
break;
case UIEventSubtypeRemoteControlPlay:
[self.circularProgressView play];
default:
break;
}
}
- (BOOL)shouldAutorotate{
return YES;
}
----我知道我在 buttonRecord 事件中做错了代码。但是当我调试应用程序时,按钮被禁用并且无法按下。请指导我,我将不胜感激。
- (IBAction)buttonTapped:(id)sender {
if (player.playing) {
[player stop];
}
if (!recorder.recording) {
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setActive:YES error:nil];
// Start recording
[recorder record];
[buttonRecord setTitle:@"Pause" forState:UIControlStateNormal];
} else {
// Pause recording
[recorder pause];
[buttonRecord setTitle:@"Record" forState:UIControlStateNormal];
}
//[stopButton setEnabled:YES];
[_playButton setEnabled:NO];
timer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(updateCircularProgressBar)
userInfo:nil
repeats:YES];
NSLog(@"playTapped");
if (!recorder.recording) {
player =[[AVAudioPlayer alloc]initWithContentsOfURL:recorder.url error:nil];
//[player setDelegate:self];
[buttonRecord setEnabled:YES];
[recorder recordForDuration:(NSTimeInterval)10];
[recorder record];
}
}
- (IBAction)playbuttontTapped:(id)sender {
if (!recorder.recording){
player = [[AVAudioPlayer alloc] initWithContentsOfURL:recorder.url error:nil];
[player setDelegate:self];
[player play];
}}
你 viewDidLoad
中的最后一行导致你的记录按钮被禁用,你为什么要添加这个 [buttonRecord setEnabled:NO];
您可以尝试将其更改为 [buttonRecord setEnabled:YES];
或完全删除该行