#iphone #objective-c #ios #orientation #multiview
#iPhone #objective-c #iOS #ориентация #мультивидение
Вопрос:
У меня есть приложение для мультивидения с панелью инструментов. Корневой контроллер представления управляет панелью инструментов, но другие представления имеют свой собственный класс view controller. Я использую подобный код для загрузки представлений:
-(IBAction)loadBand1Start:(id)sender{
[self clearView];
Band1Start *band1Controller = [[Band1Start alloc] initWithNibName:@"Band1Start" bundle:nil];
self.band1Start = band1Controller;
[band1Controller release];
[self.view insertSubview:band1Start.view atIndex:0];
if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) {
band1Start.view.frame=CGRectMake(0, 0, 480.0, 260.0);
} else {
band1Start.view.frame=CGRectMake(0, 0, 320.0, 400.0);
}
}
Инструкция IF предназначена для того, чтобы оно загружалось в правильной ориентации. Без этого, хотя оно вращается нормально, оно всегда загружается в портретном режиме, даже если телефон находится в альбомной ориентации.
Автоматический размер и поворот работают. Я использовал IB для создания своих элементов в портретном режиме. Когда телефон поворачивается в альбомную ориентацию, они поворачиваются и изменяют размер, однако с некоторыми выступами повернутый макет выглядит неправильно. Есть перекрытия и т.д., Что является распространенной проблемой, и я знаю, что это можно исправить с помощью CGRectMake.
Однако не имеет значения, куда я помещаю CGRectCode, он не выполняется. Я попытался поместить его в willRotateToInterfaceOrientation, willAnimateRotationToInterfaceOrientation и viewWillAppear, но повернутый макет не изменился.
Если я использую приведенный ниже код для переключения видов, повернутый макет будет таким, как я хочу, но панель инструментов не появится:
-(IBAction)loadBand1Start:(id)sender{
[self clearView];
Band1Start *band1Controller = [[Band1Start alloc] initWithNibName:@"Band1Start" bundle:nil];
[self presentModalViewController:band1Controller animated:NO];
[band1Controller release];
}
Я думаю, это связано с тем, что контроллер представления для панели инструментов должен быть контроллером корневого представления, чтобы панель инструментов отображалась, но уведомления об изменении ориентации получает только контроллер корневого представления.
Итак, если я сохраняю свой контроллер панели инструментов в качестве контроллера корневого представления, контроллер вложенного представления не получает уведомлений об ориентации, поэтому не выполняет мой код CGRectMake, но если я сделаю контроллер вложенного представления контроллером корневого представления, он получает уведомления нормально, но панель инструментов не отображается, потому что это контроллер не является корневым контроллером.
Правильно ли я понимаю, в чем здесь проблема? Есть ли способ обойти это?
Комментарии:
1. Вы внедрили
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
?2. Да, я возвращаю «ДА» для этого во всех моих файлах .m.
3. Автоматический поворот и изменение размера работают, просто пользовательский макет этого не делает.