Читая комментарии, опубликованные выше, и проблему, с которой вы столкнулись, я могу сказать, что вы добавили иерархию подпредставлений. Рассмотрим следующий случай
1) Я добавляю контроллер представления (VC), контроллер навигации, контроллер панели вкладок непосредственно в окно. Последующие представления будут получать уведомления о любых изменениях ориентации должным образом.
2) Я добавляю родительский контроллер представления в окно, а затем добавляю представления некоторых других контроллеров представления в мой родительский контроллер представления, в этом конкретном случае вы получите методы делегата изменения ориентации, вызываемые правильно в родительском VC, но не в последующем контроллеры представления, чье представление вы добавили в свой родительский VC
Однажды я добавил базовый контроллер представления в окно своего приложения, где у базового контроллера был ScrollView , позже я добавил подвиды моих четырех контроллеров представления в scrollview.
![введите здесь описание изображения](https://i.stack.imgur.com/teGOs.png)
(недействительно) viewDidLoad {
DNAppDelegate *appDelegate = (DNAppDelegate*)[UIApplication sharedApplication].delegate;
CGRect viewCustormFrame = appDelegate.viewCustomTabBar.frame;
viewCustormFrame.origin.y = self.view.frame.size.height-35;
if(UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)) {
viewCustormFrame.size.width = self.view.frame.size.width;
}
else {
viewCustormFrame.size.width = self.view.frame.size.width;
}
[self.view addSubview:appDelegate.viewCustomTabBar];
appDelegate.viewCustomTabBar.frame = viewCustormFrame;
[srclViewMainContent addSubview:appDelegate.homeController.view];
[srclViewMainContent addSubview:appDelegate.newsListController.view];
[srclViewMainContent addSubview:appDelegate.columnController.view];
[srclViewMainContent addSubview:appDelegate.whatsOnController.view];
currentVisisbleController = appDelegate.homeController;
[self resetAllSizes];
[super viewDidLoad];
}
В приведенном выше случае, хотя я получил, что все методы делегата ориентации вызываются в базовом VC, но не в другом Four VC.. поэтому мне пришлось настроить что-то вроде
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
DNAppDelegate *appDelegate = (DNAppDelegate*)[UIApplication sharedApplication].delegate;
[appDelegate.homeController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
[appDelegate.newsListController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
[appDelegate.columnController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
[appDelegate.whatsOnController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
DNAppDelegate *appDelegate = (DNAppDelegate*)[UIApplication sharedApplication].delegate;
currentPageOffset = srclViewMainContent.contentOffset.x/srclViewMainContent.frame.size.width;
[appDelegate.homeController willRotateToInterfaceOrientation:toInterfaceOrientation duration:(NSTimeInterval)duration];
[appDelegate.newsListController willRotateToInterfaceOrientation:toInterfaceOrientation duration:(NSTimeInterval)duration];
[appDelegate.columnController willRotateToInterfaceOrientation:toInterfaceOrientation duration:(NSTimeInterval)duration];
[appDelegate.whatsOnController willRotateToInterfaceOrientation:toInterfaceOrientation duration:(NSTimeInterval)duration];
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
DNAppDelegate *appDelegate = (DNAppDelegate*)[UIApplication sharedApplication].delegate;
[self resetAllSizes];
CGRect visibleRect = CGRectMake(currentPageOffset*srclViewMainContent.frame.size.width, 0, srclViewMainContent.frame.size.width, srclViewMainContent.frame.size.height);
[srclViewMainContent scrollRectToVisible:visibleRect animated:NO];
[appDelegate.homeController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
[appDelegate.newsListController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
[appDelegate.columnController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
[appDelegate.whatsOnController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
}
т. е. вызовите эти методы делегата на соответствующих VC из Base VC. Мне пришлось сделать это, потому что мое приложение было полностью построено, а позже мне пришлось изменить архитектуру, чтобы разрешить прокрутку между различными представлениями. Но я уже реализовал эти представления, взяв четыре контроллера представления.
В двух словах, любой VC (также контроллер навигации, контроллер панели вкладок, контроллер разделенного представления), добавленный непосредственно в окно, будет распространять эти методы делегата изменения ориентации на последующие VC, но контроллер представления не будет передавать эти методы делегата VC, спускающимся по дорожке.
Надеюсь, это даст вам некоторое представление. На всякий случай, если вы столкнетесь с каким-либо хорошим решением, опубликуйте его в качестве ответа и поделитесь со всеми нами.
person
Rahul Sharma
schedule
11.05.2012