Обработка изменения ориентации в пользовательском SplitViewController?

Я написал пользовательский SplitViewController, который имеет мастер (пользовательский UITableView) и контроллер подробного представления, и он отлично работает в ландшафтном режиме iPad.

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

Кто-нибудь знает, как я могу это сделать?

ОБНОВИТЬ :

Я написал прослушиватель в своем собственном SplitViewController, чтобы следить за изменением ориентации, и подключил его к селектору (resetViews :), который выглядит примерно так:

-(void)resetViews{

 if(currentOrientation == UIDeviceOrientationPortrait || currentOrientation ==       UIDeviceOrientationPortraitUpsideDown){

    self.view.frame = CGRectMake(0, 0, 768, 1024);
    masterView.frame = CGRectMake(MASTER_VIEW_PORTRAIT_X,MASTER_VIEW_PORTRAIT_Y,MASTER_VIEW_WIDTH_PORTRAIT,MASTER_VIEW_HEIGHT_PORTAIT);
    detailView.frame = CGRectMake(DETAIL_VIEW_PORTRAIT_X, DETAIL_VIEW_PORTRAIT_Y, DETAIL_VIEW_WIDTH_PORTRAIT, DETAIL_VIEW_HEIGHT_PORTAIT);



}
if(currentOrientation == UIDeviceOrientationLandscapeRight || currentOrientation == UIDeviceOrientationLandscapeLeft){
    NSLog(@"IN Landscape");
    self.view.frame = CGRectMake(0, 0, 1024, 768);
   masterView.frame = CGRectMake(MASTER_VIEW_LANDSCAPE_X,MASTER_VIEW_LANDSCAPE_Y,MASTER_VIEW_WIDTH_LANDSCAPE,MASTER_VIEW_HEIGHT_LANDSCAPE);
    detailView.frame = CGRectMake(DETAIL_VIEW_LANDSCAPE_X,DETAIL_VIEW_LANDSCAPE_Y, DETAIL_VIEW_WIDTH_LANDSCAPE, DETAIL_VIEW_HEIGHT_LANDSCAPE);


}

}

Это отлично работает при установке фреймов viewControllers.

Но MasterViewController (UITableViewController) должен динамически изменять высоту своих строк (tableView.rowHeight) при изменении ориентации. Как мне это сделать без необходимости перезагрузки всего tableView ([tableView reloadData]) для каждого изменения ориентации?


person Sagar    schedule 23.08.2012    source источник
comment
Вы хотите получить такое же поведение, как стандартный UISplitViewController, где основной вид полностью исчезает в портретной ориентации, или что-то вроде приложения «Настройки», где основной вид остается на экране, тем самым сужая подробный вид?   -  person amadour    schedule 23.08.2012
comment
Когда ориентация изменяется (скажем, с альбомной на портретную), я хочу, чтобы основной вид сужался по ширине и расширялся по высоте (rowHeight ячеек таблицы должен соответствующим образом корректироваться). Детальный вид также должен быть изменен. Эти изменения должны вернуться обратно, когда ориентация изменится обратно на альбомную!   -  person Sagar    schedule 23.08.2012


Ответы (2)


Вы пытались установить autoresizingMasks, чтобы указать желаемое поведение изменения размера ваших представлений? Что-то вроде этого должно соответствовать описанному вами изменению размера:

splitViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoResizingFlexibleHeight;
masterViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoResizingFlexibleHeight;
detailViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoResizingFlexibleHeight;
person amadour    schedule 24.08.2012
comment
Спасибо за предложение! Я попробовал это, но не работает так, как мне нужно, когда я пытался установить свойство autoResizingMask, весь tableView выходит из представления iPad в портретном режиме! - person Sagar; 27.08.2012

Подкласс UISplitViewController и установите ваш splitViewController в этот класс. Затем добавьте этот метод в свой подкласс UISplitViewController:

-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation {
    return NO;
}

Если вам нужен простой способ поменять детальный вид, добавьте этот метод:

-(void)setDetailControllerTo:(UIViewController *)detailController withNavControllerTitle:(NSString *)title {
[detailController view]; // this line forces the viewDidLoad method to be called

if (title) {
    UINavigationController *navController = [[UINavigationController alloc] init];
    [navController pushViewController:detailController animated:YES];
    detailController.title = title;

    NSArray *viewControllers=@[self.mainController.viewControllers[0],navController];
    self.mainController.viewControllers = viewControllers;
} else {
    NSArray *viewControllers=@[self.mainController.viewControllers[0],detailController];
    self.mainController.viewControllers = viewControllers;
}

}

Чтобы вызвать этот метод, сделайте что-то подобное из главного контроллера представления в методе tableView:didSelectRowAtIndexPath:

FixedSplitViewController *splitController = (FixedSplitViewController*) self.splitViewController;

CurrentEventViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"CurrentEventViewController"];
// add any setup code here
[splitController setDetailControllerTo:controller withNavControllerTitle:@"Current Event"];
person Aaron Bratcher    schedule 08.11.2013