Макет приложения iPhone с возможностью поворота в режиме множественного просмотра с панелью инструментов

#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. Автоматический поворот и изменение размера работают, просто пользовательский макет этого не делает.