iPhone / iPad - переключение видов вызывает проблемы с ориентацией - PullRequest
0 голосов
/ 28 сентября 2010

Я работаю над универсальным приложением для iPhone / iPad. Я использую MonoTouch, но я могу отвечать на вопросы в Obj-C (я должен иметь возможность расшифровать его, и UIKit MonoTouch по большей части равен 1 к 1).

В основном мое приложение имеет 2 представления: представление «вход в систему» ​​и представление «вход в систему».

При запуске приложения мой вид входа в систему является единственным подпредставлением моего основного окна UIWindow. После входа в систему я вызываю RemoveFromSuperview в представлении входа в систему и UIWindow.AddSubView, чтобы добавить представление входа в систему. Все это прекрасно работает, и ориентации работают также, потому что я отвечаю на ShouldAutorotateToInterfaceOrientation.

Все до тех пор, пока вы не выйдете из системы, и ориентация не начнет подниматься. На ориентации приложение ориентирует строку состояния, но оставляет мои взгляды нетронутыми. Кроме того, на iPad мой UISplitView работает очень странно: мой основной вид ориентирован в одну сторону, а детальный - в другую.

Как правильно переключать представления в окне UIWindow? Я чувствую, что ориентации должны работать автоматически, поэтому я делаю что-то не так.

UPDATE:

Вот фрагмент кода (в C #, но вы поняли):

_loginController.View.RemoveFromSuperView();
_window.AddSubView(_loggedInController.View);

Чтобы сделать обратное:

_loggedInController.View.RemoveFromSuperView();
_window.AddSubView(_loginController.View);

Довольно просто, верно?

ОБНОВЛЕНИЕ 2:

Я сделал простое воспроизведение - даже включил UISplitViewController, и он работает просто отлично.

В моем приложении должно быть что-то конкретное, что вызывает такое странное поведение.

Ответы [ 3 ]

0 голосов
/ 28 сентября 2010

Хорошо, я вижу, у меня есть похожее приложение, но я по-другому подошел к проблеме.

Я создал и инициализировал splitViewController в методе appDidFinishLaunching и передал его на экран входа в систему.

 theLoginScreen = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:[NSBundle mainBundle]];
    theLoginScreen.splitViewController = splitViewController;
    theLoginScreen.detailViewController = detailViewController;
    theLoginScreen.rootViewController = rootViewController;
    theLoginScreen.appDelegate = self;

    [window addSubview:theLoginScreen.view];

Отсюда я выполнил вход в систему, а затем сделал что-то вроде этого:

[self.view removeFromSuperview];

    CGRect frame = [[UIScreen mainScreen] applicationFrame];

    switch(splitViewController.interfaceOrientation){
        case UIInterfaceOrientationPortrait:
        case UIInterfaceOrientationPortraitUpsideDown:
            [splitViewController.view setFrame:frame];
            break;
        case UIInterfaceOrientationLandscapeLeft:
        case UIInterfaceOrientationLandscapeRight:
            [splitViewController.view setFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.height, frame.size.width)];
            break;
    }

    [appDelegate.window addSubview:splitViewController.view];

Сделайте что-то подобное и посмотрите, работает ли это.:)

0 голосов
/ 14 октября 2010

В моем новом проекте случайно возникла проблема (не уверен, что я изменил, чтобы это произошло).Таким образом, должно быть что-то в моем макете пользовательского интерфейса, вызывающее это.

Я взял предложение от комментатора и взглянул на модальные представления.

Следующее прекрасно работает:

  • Сделал SplitViewController представлением верхнего уровня
  • Сделал отображение приглашения на вход в систему модальным из SVC
  • Функциональность выхода из системы: _loggedInController.PresentModalViewController (_loginController, true);
  • Функциональность входа в систему: _loggedInController.DismissModalViewControllerAnimated (true);
  • Код ориентации для исправления фрейма SVC все еще необходимо добавить в ViewDidLoad

Никаких странных проблем с ориентацией сейчас не возникает.

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

0 голосов
/ 28 сентября 2010

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

CGRect frame = [[UIScreen mainScreen] applicationFrame];

    switch(splitViewController.interfaceOrientation){
        case UIInterfaceOrientationPortrait:
        case UIInterfaceOrientationPortraitUpsideDown:
            [splitViewController.view setFrame:frame];
            break;
        case UIInterfaceOrientationLandscapeLeft:
        case UIInterfaceOrientationLandscapeRight:
            [splitViewController.view setFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.height, frame.size.width)];
            break;
    }

В основном получают текущий фрейм приложения и вручную ориентируют его. В splitViewController есть ошибка, которая не проверяет ориентацию, если вы отображаете ее после выполнения метода applicationDidFinishLaunching.

...