Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Red recording bar distorting view

I'm having a heck of a time figuring this out.

I have a modal view that appears when tapping on one of the tabs of a tab bar. In the new view that takes over the whole screen, there is a button a user taps to start recording audio, and when they're finished recording audio, or if they cancel recording, the modal view is dismissed.

The problem is that, once they start recording, that red recording bar should appear on this new view. But it's not. And as soon as that view is dismissed, in the next view that is presented (a table view, which is found in one of the tabs), you can see the red recording bar at the top for a split second and it disappears BUT it shoves the tab bar down the screen and obscures part of the tab bar, which you can see in the third screenshot below.

Modal view pops up - recording is currently in progress, but red recording indicator is not showing at the top Modal view pops up - recording is currently in progress, but red recording indicator is not showing at the top

Right when the recording is done and the view is about to disappear, the red bar appears Right when the recording is done and the view is about to disappear, the red bar appears

And once the view disappears and we're left with the table view that lives in one of the tabs, the tab bar is shoved down past the bottom of the screen :( And once the view disappears and we're left with the table view that lives in one of the tabs, the tab bar is shoved down past the bottom of the screen :( It SHOULD look like this (with the fourth tab selected): enter image description here

My questions:

1) What am I doing wrong that's causing the red recording bar to NOT show up in the modal view?

2) Is there a way to maybe refresh this view from the screenshot so that when it appears, it resizes properly?

Here's the code. I removed some of the non-important stuff that doesn't deal with the views.

@interface AudioViewController ()

@end

@implementation AudioViewController

@synthesize fileData;

UILabel *countdownLabel;

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.friendsRelation = [[PFUser currentUser] objectForKey:@"friendsRelation"];
    self.recipients = [[NSMutableArray alloc] init];
}


- (void) viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    self.audioPicker = [[UIViewController alloc] init];
    self.audioPicker.view.backgroundColor = [UIColor yellowColor];

    self.friendsRelation = [[PFUser currentUser] objectForKey:@"friendsRelation"];
    PFQuery *query = [self.friendsRelation query];
    [query orderByAscending:@"username"];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (error) {
            NSLog(@"Error %@ %@", error, [error userInfo]);
        }
        else {
            self.friends = objects;
            [self.tableView reloadData];
        }
    }];

    UIButton *cancelBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    cancelBtn.frame = CGRectMake(50.0, 200.0, 200.0, 200.0);
    cancelBtn.titleLabel.font = [UIFont systemFontOfSize:20];
    [cancelBtn setTitle:@"Cancel" forState:UIControlStateNormal];
    [self.audioPicker.view addSubview:cancelBtn];
    cancelBtn.center = CGPointMake(self.view.center.x, 400);
    [cancelBtn addTarget:self action:@selector(exitRecordingScreen) forControlEvents:UIControlEventTouchUpInside];

    UIButton *recordBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    recordBtn.frame = CGRectMake(50.0, 50.0, 200.0, 200.0);
    recordBtn.titleLabel.font = [UIFont systemFontOfSize:50];
    [recordBtn setTitle:@"Record" forState:UIControlStateNormal];
    recordBtn.center = CGPointMake(self.view.center.x, 100);
    [self.audioPicker.view addSubview:recordBtn];

    if ([self respondsToSelector:@selector(timeout)]) {
        [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeout) userInfo:nil repeats:NO];
    } else {
        NSLog(@"Error: missing selector");
    }

    AVAudioSession *session = [AVAudioSession sharedInstance];

    [session setCategory:AVAudioSessionCategoryPlayAndRecord
             withOptions:AVAudioSessionCategoryOptionDuckOthers
                   error:nil];

    if (!fileData) {
        [self presentViewController:self.audioPicker animated:NO completion:nil];
        NSLog(@"File data: %@", fileData);
        [recordBtn addTarget:self action:@selector(startRecordingAudio) forControlEvents:UIControlEventTouchUpInside];
    } else {
        NSLog(@"Existing File data: %@", fileData);
    }
}

- (void) timeout {

    [self.navigationController popViewControllerAnimated:YES];
}

# pragma mark - Audio Recording Methods

////////
// Removed some stuff here that is not manipulating views
////////

- (void) stopRecordingOnAudioRecorder:(AVAudioRecorder *)paramRecorder{
    /* Just stop the audio recorder here */
    [paramRecorder stop];
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder
                           successfully:(BOOL)flag{
    if (flag) {
        NSLog(@"Stopped recording process");
        NSError *playbackError = nil;
        NSError *readingError = nil;
        fileData = [NSData dataWithContentsOfURL:[self audioRecordingPath]
                              options:NSDataReadingMapped
                                error:&readingError];

        self.audioPlayer = [[AVAudioPlayer alloc] initWithData:fileData
                                                         error:&playbackError];

        if (self.audioPlayer != nil) {
            self.audioPlayer.delegate = self;

            //Prepare and start playing
            if ([self.audioPlayer prepareToPlay] && [self.audioPlayer play]) {
                NSLog(@"Started playing recorded audio");
            } else {
                NSLog(@"Couldn't play recorded audio");
            }


        } else {
            NSLog(@"Failed to create audio player");
        }
    } else {
        NSLog(@"Stopping audio recording failed");
    }
    self.audioRecorder = nil;
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player
                       successfully:(BOOL)flag{
    if (flag){
        NSLog(@"Audio player stopped correctly.");
    } else {
        NSLog(@"Audio player did not stop correctly.");
    }
    if ([player isEqual:self.audioPlayer]){
        self.audioPlayer = nil;
    } else {
        /* This is not the player */
    }
}

# pragma mark - TableView methods

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.friends count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    PFUser *user = [self.friends objectAtIndex:indexPath.row];
    cell.textLabel.text = user.username;

    // makes sure checkmark isn't reused if user didn't explicitly select name
    if ([self.recipients containsObject:user.objectId]) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    return cell;
}

- (void)reset {
    self.audioFile = nil;
}

// User hits "Cancel" button
-(void)exitRecordingScreen {
    [self reset];
    [self.presentedViewController dismissViewControllerAnimated:NO completion:nil];
    [self.tabBarController setSelectedIndex:0];
    NSLog(@"exit recording screen button pressed");

}

- (IBAction)send:(id)sender {
    if (self.audioFile == nil) {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Please try again." message:@"Please record audio again to share." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

        [alertView show];
        [self presentViewController:self.audioPicker animated:NO completion:nil];
    } else {
        [self uploadMessage];
        [self.tabBarController setSelectedIndex:0];
    }
}
// Cancel sending recorded file
- (void)cancel:(id)sender {
    fileData = nil;
    [self reset];
    [self.tabBarController setSelectedIndex:0];
}

@end

Sorry for the wall of text and the length. I'm really stumped.

like image 976
kevingduck Avatar asked Mar 28 '26 18:03

kevingduck


1 Answers

Solution : You have to reset frame for UITabBarController. 1. Initially frame for UITabBarController will be (0,0,screenWidth,screenHeight). 2. But when this recording red bar appear it becomes (0,20,screenWidth,screenHeight) 3. Here you are supposed to change height for UITabBarController

CGRect changedFrame = objMainTabBarController.view.frame; changedFrame.size.height = [UIScreen mainScreen].bounds.size.height - CGRectGetMinY(changedFrame); objMainTabBarController.view.frame = changedFrame;

That's it..

like image 144
Eliza Avatar answered Mar 31 '26 12:03

Eliza



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!