ориентация экрана айфона

Привет, я пытаюсь обеспечить ориентацию экрана в своем приложении, и я прочитал много документов в Интернете, но когда я пытаюсь это сделать, это просто полная катастрофа (я пробовал эмулятор и iphone). С одной стороны, когда экран повернут в альбомную ориентацию, половина видов больше не видна. Их позиция находится слева, а правая сторона пуста, плюс, если я открою следующий контроллер представления, а затем снова поверну, я смогу видеть сквозь части второго представления первого представления, это просто ужасно, я не знаю, как это исправить (Исключая блокировку возможности зафиксировать ориентацию в книжной ориентации). Я знаю, что в Android вы можете предоставить разные макеты xml для портретной и альбомной ориентации. Есть ли способ сделать это в iphone? Если да, то как?

каждое из моих представлений состоит из контроллера и .xib. Существует «основной» контроллер, а другие контроллеры называются так:

ayuda=[[AyudaView alloc]
               initWithNibName:@"AyudaView"
               bundle:nil];
        [self.view addSubview:ayuda.view];

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

- (void)viewWillAppear:(BOOL)animated
{  
[super viewWillAppear:animated];

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
if(UIDeviceOrientationIsValidInterfaceOrientation(orientation)) {
    [self handleInterfaceRotationForOrientation:orientation];
}

}
#pragma mark -
#pragma mark Screen Orientation Handling
- (void)handleInterfaceRotationForOrientation:(UIInterfaceOrientation)interfaceOrientation {
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
[self handleInterfaceRotationForOrientation:interfaceOrientation];
return YES;
}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation   duration:(NSTimeInterval)duration {
[self handleInterfaceRotationForOrientation:toInterfaceOrientation];
}

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

Большое Вам спасибо

РЕДАКТИРОВАТЬ: хорошо, я читал еще немного:

http://www.geckogeek.fr/iphone-forcer-le-mode-landscape-ou-portrait-en-cours-dexecution.html

http://www.cocoaosx.com/2011/11/10/rotatingviewcontroller-display-a-different-uiviewcontroller-depending-on-the-rotation-of-the-device/

и в основном я обнаружил, что вам нужно создать 2 контроллера, но это решение проблематично для меня из-за файлов пера. Я имею в виду, что мне также пришлось бы создать 2 пера, чтобы удвоить количество кода (или использовать библиотеку выше). Что, если у меня есть значения в моих текстовых полях, мне просто нужно их отправить?


person vallllll    schedule 08.02.2012    source источник
comment
Вы почти не имеете представления о том, как все должно работать, поэтому на вопрос практически невозможно ответить, не ознакомив вас со всем решением. И Stack Overflow не предназначен для такой работы. Я предлагаю вам погуглить какой-нибудь учебник по интерфейсу Cocoa и медленно пройти его, переходя от более простых случаев к более сложным.   -  person zoul    schedule 08.02.2012
comment
Вы читали документацию Apple по этому поводу?   -  person Nick Bull    schedule 08.02.2012


Ответы (1)


Итак, помимо комментариев, предполагающих, что вы не имеете ни малейшего представления о том, что происходит в вашем коде (что может быть правдой, а может и нет - кто я такой, чтобы судить?), я вижу несколько проблем.

Первая проблема заключается в том, что я не думаю, что вы понимаете MVC и то, как iOS обрабатывает иерархию представлений. Вы правы в том, что каждое из ваших представлений управляется контроллером и разрабатывается с помощью .xib (есть случаи, когда представлению не нужен собственный контроллер, но для простоты мы предположим, что вам нужен). Однако вы ошибаетесь в том, как вы представляете эти представления на экране. Контроллер представления отвечает за представление или удаление представления с экрана. Представление знает только то, что оно отображает, например метки или кнопки. Контроллер отвечает за указание представлению что отображать на этих метках и кнопках. Вместо того, чтобы добавлять новое представление VC в качестве подвида основного представления, поместите его в стек навигационного контроллера или представьте представление модально. Если вы находитесь в своем основном ВК, вы можете сказать

ayuda = [[AyudaView alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:ayuda animated:YES];

Я думаю, что правильной иерархии видов может быть достаточно, чтобы решить ваш хаос с заменой пейзажа/портрета. Но раз уж мы затронули эту тему... зачем вы создаете этот метод handleInterfaceRotation? Контроллеры представления уже имеют для этого метод, называемый

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;

Используйте этот метод для обработки поворота.

person jmstone617    schedule 08.02.2012
comment
Большое спасибо за ваш ответ! Я неправильно называл все свои подвиды. С другой стороны, я обнаружил проблему вращения и заключается в том, что я не сохранял свои взгляды в родительском представлении, сохраняя их, чтобы решить мою проблему. - person vallllll; 08.02.2012
comment
Я бы все же посоветовал не пытаться изобретать колесо и использовать метод willAnimateRotationToInterfaceOrientation для обработки того, что происходит, когда ориентация вашего представления изменяется. - person jmstone617; 08.02.2012