UINavigationController загружает представление неправильно из-за Ориентации / Встряхивания - PullRequest
6 голосов
/ 13 июля 2011

Справочная информация: приложение встряхнуло, чтобы вернуться домой.Домашний вид поддерживает только портрет.Если вы встряхиваете немного сильнее, чем обычно, изображение, которое вы используете, начинает вращаться (что нормально), но затем оно обнаруживает сотрясение и выполняет popViewControlller для домашнего представления.Когда он делает это, он просто отлично загружает контроллер навигации, но представление под (домашним контентом) загружается за полосой и растягивается (в основном оно загружается под панелью навигации, поэтому оно растягивается)

Кнопка «назад» прекрасно справляется с этой задачей - от пейзажа до портрета (поскольку она не переходит в середину)

Как мне поступить с этим изменением ориентации (из-за сотрясения), чтобы я мог вернуться в корневой контроллер вида,без загрузки представления под панелью навигации?

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

добавлено вознаграждение 50.

Редактировать Вот как я обнаруживаю тряску и треск

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{

    if ( event.subtype == UIEventSubtypeMotionShake )
    {

            UINavigationController *navController = self.navigationController;

            [[self retain] autorelease];
            HomeViewController *home = [[HomeViewController alloc]init];
            [navController popViewControllerAnimated:YES];

            home.title =@"Home View Controller";
            [home release];     
        }

    if ( [super respondsToSelector:@selector(motionEnded:withEvent:)] )
        [super motionEnded:motion withEvent:event];
}

Вот мое приложениеДелегат:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    navController = [[UINavigationController alloc]init];
    [self.window addSubview:navController.view];

    HomeViewController *home = [[HomeViewController alloc]init];
    [[self home] setFrame:[[UIScreen mainScreen] applicationFrame]];

Я включу макет здесь.

Обычный вид:

Normal View

Растянутый вид после встряхивания / хлопанья:

Streched

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return YES;
}

Ответы [ 4 ]

2 голосов
/ 27 июля 2011

Я немного озадачен вашим кодом, поэтому я действительно рекомендовал бы начать с самого начала.Как упоминал Лукья, нет причин для воссоздания HomeViewController.Я также сбит с толку "[самосохранение] авто-релиз];"немного.Это не должно быть необходимо, если вы не делаете что-то неправильно в другом месте.

Поэтому я бы начал с этого ... В приложении: didFinishLaunchingWithOptions: сделайте что-то вроде этого:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    {
        HomeViewController *home = [[[HomeViewController alloc] init] autorelease];
        UINavigationController *navController = [[[UINavigationController alloc] initWithRootViewController:home] autorelease];
        [self.window addSubview:navController.view];
    }

окно сохранит ваш навигационный контроллер, а навигационный контроллер сохранит ваш HomeViewController.

Затем в motionEnded: withEvent: сделайте что-то вроде:

    - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
    {
        if (event.subtype == UIEventSubtypeMotionShake)
        {
            [self.navigationController popViewControllerAnimated:YES];
        }
    }

Это должно быть.

Если это не сработает, то можете ли вы дать какую-либо другую информацию?Например, реализует ли HomeViewController (и возвращает ли YES) значение shouldAutorotateToInterfaceOrientation :?Если да, можете ли вы вернуть «нет», чтобы он не вращался, поскольку в первой строке написано «Домашний вид поддерживает только портрет»?

Редактировать: Пример willRotateToInterfaceOrientation:duration: и didRotateFromInterfaceOrientation:.

В заголовке для любого контроллера, который вы обнаруживаете дрожания, добавьте логическое значение:


    BOOL isRotating;

В вашем файле реализации добавьте два метода UIViewController, которые мы хотим переопределить - что-то вроде:


    - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
        [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
        isRotating = YES;
    }

    - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
        [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
        isRotating = NO;
    }

Теперь сделайте что-то подобное для вашего обработчика событий:

    - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
    {
        if (event.subtype == UIEventSubtypeMotionShake && !isRotating)
        {
            [self.navigationController popViewControllerAnimated:YES];
        }
    }
2 голосов
/ 25 июля 2011

в xib контроллера вашего домашнего просмотра, перейдите к inspector для просмотра и установите верхнюю панель в качестве панели навигации ... и в представлении загрузил набор self.navigationBarHidden = NO; ...

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

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if (event.subtype == UIEventSubtypeMotionShake)
    {
        [navController popViewControllerAnimated:YES];
    }
}

так что вы можете также изменить этот код ..

2 голосов
/ 26 июля 2011

Я столкнулся с этой проблемой с перекрытием панели навигации. Я не уверен, что вызывает это, но вы можете обойти это, позвонив,

[[self loadingView] setFrame:[[UIScreen mainScreen] applicationFrame]];

после добавления проблемного вида в окно в делегате приложения.

2 голосов
/ 14 июля 2011

Вы пытались позвонить [[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationPortrait animated:YES]; в своем контроллере домашнего просмотра? Вы также можете попытаться поместить это туда, где вы обнаружите сотрясение.

...