Как вращать только некоторые виды при работе с контроллером uinavigation в качестве вкладки контроллера uitabbar - PullRequest
0 голосов
/ 27 апреля 2010

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

Первое представление: TableView в стеке UINavigationController, который является вкладкой UITabBarController.

TableView разрешено только в книжной ориентации. (за работой) Когда вы поворачиваете TableView, чтобы создать модальный ландшафт, вы получаете пользовательский UIView, похожий на покровный поток (который я сейчас объясню здесь).

Выбор, сделанный для таблицы, помещает UIScrollview в стек.

UIScrollView допускается во всех ориентациях. (Работа)

Когда UIScrollView находится в ландшафтном режиме, и пользователь наносит ответный удар, он перенаправляется в пользовательский UIView, который похож на прикрытие и допускает только альбомную ориентацию.

Проблема здесь. Поскольку UIScrollView допускает полное вращение, он позволяет TableView вращаться также и в горизонтальной плоскости.

У меня есть метод, прикрепленный к уведомлению "UIDeviceOrientationDidChangeNotification", который проверяет, является ли пользовательское представление текущим контроллером, и если это так, и если пользователь повернулся обратно в портрет, мне нужно открыть пользовательское представление и показать таблицу вид.

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

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

Моя другая проблема очень похожа. Если вы просматриваете таблицу и поворачиваете ее, отображается модальное представление пользовательского вида. Когда вы делаете выбор в этом представлении, он помещает UIScrollview в стек, но, поскольку Tableview поддерживает только портрет, UIScrollview входит в портрет, когда устройство находится в альбомном режиме.

Как мне преодолеть эти ужасные блоки?

Это моя текущая попытка:

Когда речь идет о работе с UITabBarController, система действительно заботится только о том, что tabbarcontroller говорит о вращении.

В настоящее время при загрузке представления оно сообщает о поддерживаемых ориентациях.

TabBarController.m

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
switch (self.supportedOrientation) {
    case SupportPortraitOrientation:
        [[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES]; 
        return (interfaceOrientation == UIInterfaceOrientationPortrait);
        break;
    case SupportPortraitUpsideDownOrientation:
        [[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES]; 
        return (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
        break;
    case SupportPortraitAllOrientation:
        [[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES]; 
        return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
        break;
    case SupportLandscapeLeftOrientation:
        [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES]; 
        return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
        break;
    case SupportLandscapeRightOrienation:
        [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];            
        return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
        break;
    case SupportLandscapeAllOrientation:
        [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES]; 
        return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight);
        break;
    case SupportAllOrientation:
        if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
            [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES]; 
        }else {
            //[[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES]; 
        }
        return YES;
        break;
    default:
        return (interfaceOrientation == UIInterfaceOrientationPortrait);
        break;
    }

}

Этот блок кода является частью моего UINavigationController и находится в методе, который отвечает на уведомление UIDeviceOrientationDidChangeNotification. Он отвечает за отображение пользовательского представления и отображение таблицы. Существуют две разные версии, которые изначально предназначались для двух разных версий SDK, но обе довольно близки к решениям.

Причина, по которой первая версия не поддерживается в версии 3.0, заключается в том, что по какой-то причине у вас не может быть представления, которое отображается, а затем отображается как модальное представление. Не уверен, что это ошибка или особенность.

Второе решение работает довольно хорошо, за исключением того, что я вижу внешнюю коробку, вращающуюся вокруг iphone.

if ([[self topViewController] isKindOfClass:FlowViewController.class]) {
    NSString *iphoneVersion = [[UIDevice currentDevice] systemVersion];
    double version = [iphoneVersion doubleValue];
    if(version > 3.0){ //1st solution
        //if the delivered app is not built with the 3.1 SDK I don't think this will happen anyway
        //we need to test this
        [self presentModalViewController:self.flowViewController animated:NO];
        //[self toInterfaceOrientation:UIDeviceOrientationPortrait animated:NO];
        [self popViewControllerAnimated:NO];
        [self setNavigationBarHidden:NO animated:NO];
        [self dismissModalViewControllerAnimated:YES];
    }else{ //2nd solution
        DLog(@"3.0!!");
        //[self toInterfaceOrientation:UIDeviceOrientationPortrait animated:NO];
        CATransition *transition = [CATransition animation];
        transition.duration = 0.50;
        transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
        transition.type = kCATransitionPush;
        transition.subtype = kCATransitionFade;

        CATransition *tabBarControllerLayer = [CATransition animation];
        tabBarControllerLayer.duration = 0.50;
        tabBarControllerLayer.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
        tabBarControllerLayer.type = kCATransitionPush;
        tabBarControllerLayer.subtype = kCATransitionFade;

        [self.tabBarController.view.layer addAnimation:transition forKey:kCATransition];
        [self.view.layer addAnimation:transition forKey:kCATransition];
        [self popViewControllerAnimated:NO];
        [self setNavigationBarHidden:NO animated:NO];

    }
    [self performSelector:@selector(resetFlow) withObject:nil afterDelay:0.75];

}

Я почти уверен, что нет решения, кроме ручного вращения, которое портит вращение клавиатуры.

Любой совет будет оценен!

Спасибо.

Ответы [ 2 ]

0 голосов
/ 09 декабря 2013

привет, вы можете попробовать все это:

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

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        return UIInterfaceOrientationMaskPortrait;
    } else {
        return UIInterfaceOrientationMaskAll;
    }
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}

Затем вы должны создать подкласс UINavigationController и UITabBarController, поэтому вот код:

//cCustomNavigationController.h file

#import <UIKit/UIKit.h>

@interface cCustomNavigationController : UINavigationController <UINavigationControllerDelegate>

@end

//cCustomNavigationController.m file

#import "cCustomNavigationController.h"

@interface cCustomNavigationController ()

@end

@implementation cCustomNavigationController 

- (BOOL)shouldAutorotate {
    return [self.visibleViewController shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations {
    return [self.visibleViewController supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return [self.visibleViewController preferredInterfaceOrientationForPresentation];
}

@end

//cCustomTabController.h file

#import <UIKit/UIKit.h>

@interface cCustomTabController : UITabBarController <UITabBarControllerDelegate>

@end

//cCustomTabController.m file

#import "cCustomTabController.h"

@interface cCustomTabController  ()

@end

@implementation cCustomTabController

- (BOOL)shouldAutorotate {
    return [self.selectedViewController shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations {
    return [self.selectedViewController supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return [self.selectedViewController preferredInterfaceOrientationForPresentation];
}

@end

теперь вам просто нужно создать ваш TabBarControler или NavigationController, используя эти классы там, где вам это нужно, т.е.

//For the UINavigationController
UINavigationController *navigationController = [[cCustomNavigationController alloc] init];

//For the UITabBarController
UITabBarController *tabController = [[cCustomTabController alloc] init];

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

Я надеюсь, что это поможет вам, но я не уверен, что это именно то, что вам нужно.

Удачного кодирования.

0 голосов
/ 01 мая 2010

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

Кроме того, этот метод предполагает, что вы не хотите видеть панель вкладок, когда у вас отключено первое представление, хотя вы можете реализовать мое решение с помощью popOverControllers, но я не уверен.

Создать контроллер панели вкладок Создать навигационный контроллер Создайте второй контроллер навигации, который не будет на контроллере вкладок поставить первый контроллер навигации в контроллере вкладок настройте методы, которые сначала будут pushViewController:

сделать скриншот текущего экрана. положить этот скриншот в UIViewController вставить этот UIViewController на второй контроллер навигации представить второй навигационный контроллер модально после задержки примерно 0,15 секунды поместите нужный контроллер вида в стек навигации второго контроллера навигации.

Теперь ваш текущий контроллер отключен от tabBarcontroller, и его вращение (потому что этот контроллер навигации представлен модально) не зависит от tabBarController!

Вам придется проделать некоторую работу, чтобы вернуться к первому виду, но это не так сложно.

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

...