2014-09-24 65 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

我得到了同樣的問題,發現沒有辦法優雅地解決它。我學到的東西是錄製音頻時不要轉換視圖控制器。 – 2015-07-09 22:56:40

+0

您是否嘗試過爲這種場景設置'edgesForExtendedLayout'屬性? – holex 2016-06-16 09:24:29

回答

1

解決方案:您必須重置UITabBarController的幀。 1.最初UITabBarController的幀將是(0,0,screenWidth,screenHeight)。 2.但是,當這種記錄紅槓出現就成了(0,20,屏幕寬度,screenHeight) 3.在這裏,你應該改變高度的UITabBarController

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

就是這樣..