2014-09-24 4 views
3

У меня чертовски время понять это.Красная запись, искажающая вид

У меня есть модальный вид, который появляется при нажатии на одну из вкладок панели вкладок. В новом представлении, которое охватывает весь экран, есть кнопка, которую пользователь вводит, чтобы начать запись звука, и когда они закончат запись звука или отменят запись, модальное представление отклоняется.

Проблема заключается в том, что после того, как они начнут запись, эта новая панель записи должна появиться на этом новом экране. Но это не так. И как только это мнение будет отклонено, в следующем представлении, представленном (табличный вид, который находится на одной из вкладок), вы можете увидеть красную полосу записи вверху в течение секунды секунды, и она исчезает, НО она выталкивает панель вкладок вниз по экрану и заслоняет часть панели вкладок, которую вы можете увидеть на третьем скриншоте ниже.

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 Право, когда запись выполняется, и представление о том, чтобы исчезнуть, красная полоса появляется

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 :( и сразу взгляд исчезает, и мы остались с точкой зрения таблицы, которая живет в одной из вкладок, панель вкладок толкнули вниз мимо нижней части экрана :(Он должен выглядеть следующим образом (с выбрана четвертая вкладка): enter image description here

Мои вопросы:

1) Что я делаю неправильно, что вызывает красную запись бар, чтобы не показывать в представлении модальное?

2) Есть ли способ обновить этот вид со скриншота, чтобы при его появлении он изменился правильно?

Вот код. Я удалил некоторые не важные вещи, которые не имеют отношения к представлениям.

@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 

Извините за стену текста и длину. Я действительно в тупике.

+0

У меня такая же проблема, и я не нашел способа ее устранить изящно. То, что я узнал, было НЕ ПЕРЕХОДИТСЯ в контроллерах просмотра при записи звука. –

+0

Вы пытались установить свойство «edgeForExtendedLayout» для такого сценария? – holex

ответ

1

Решение: Вы должны сбросить фрейм для UITabBarController. 1. Первоначально рамка для UITabBarController будет (0,0, экранная ширина, screenHeight). 2. Но когда эта запись красная полоска появляется становится (0,20, screenWidth, ScreenHeight) 3. Здесь вы должны изменить высоту для UITabBarController

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

Вот и все ..

Смежные вопросы