2013-02-15 2 views
0

Мое приложение основано на навигации и в основном работает в портретной ориентации, но один контроллер вида поддерживает как портретную, так и альбомную ориентацию. Теперь проблема заключается в том, что когда я нажимаю новый контроллер представлений из контроллера ландшафтного вида, новый контроллер представления также перемещается в ландшафтном режиме, хотя я хочу его в портретном режиме.iOS6.0 Pushing new viewController в портретной ориентации из ландшафтного видаController

Также, когда я контроллер pop view из ландшафтного контроллера, тогда в режиме портретного просмотра отображается всплывающий контроллер.

Я не знаю, что не так с моим кодом.

Вот мой фрагмент кода и информация, используемая для этой ориентации.

В файле info.plist я поддерживал поддержку для всех ориентации, но портрет upsidedown.

Я также добавил категорию для категории контроллера навигации, как показано ниже.

@implementation UINavigationController(Rotation_IOS6) 
-(BOOL)shouldAutorotate 
{ 
    return [[self.viewControllers lastObject] shouldAutorotate]; 
} 

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

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation]; 
} 
@end 

Я также создал подкласс UIViewController, который действует как суперкласс для всех классов. Вот методы ориентации для суперкласса.

@implementation ParentViewController 

- (BOOL)shouldAutorotate{ 
    return NO; 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ 
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait); 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{ 
    return UIInterfaceOrientationPortrait; 
} 
@end 

И контроллер ориентации, который поддерживает пейзаж, как показано ниже.

@implementation LandscapeController 
#pragma mark - 
#pragma mark Orientation Methods 
- (BOOL)shouldAutorotate{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
    return UIInterfaceOrientationMaskPortrait|UIInterfaceOrientationMaskLandscape; 
} 

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ 
    return (toInterfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
} 
@end 

Заранее спасибо.

+0

У меня есть один образец, который может быть полезен для u.Send ur email id, я пришлю вам, что – Vidhyanand

+0

Спасибо Vidyanand за ответ. Вот мой адрес электронной почты: [email protected] – kkumpavat

+0

В моем примере первый вид - портрет, второй вид - пейзаж, а третий вид - портрет.delete ur email – Vidhyanand

ответ

0

Вот метод, чтобы подтолкнуть view.take объектого переключения

В switch.m

+ (void)loadController:(UIViewController*)VControllerToLoad andRelease:(UIViewController*)VControllerToRelease 
{ 

VControllerToLoad.navigationController.navigationBar.frame=CGRectMake(0, 0, 568, 44); 
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame]; 
CGRect windowFrame = [[UIScreen mainScreen] bounds]; 
CGRect firstViewFrame = CGRectMake(statusBarFrame.origin.x, statusBarFrame.size.height, windowFrame.size.width, windowFrame.size.height - statusBarFrame.size.height); 
VControllerToLoad.view.frame = firstViewFrame; 

//check version and go 

if (IOS_OLDER_THAN_6) 
{ 
    [((AppDelegate*)[UIApplication sharedApplication].delegate).window addSubview:VControllerToLoad.view]; 
} 
else 
{ 
    [((AppDelegate*)[UIApplication sharedApplication].delegate).window setRootViewController:VControllerToLoad]; 

} 
    [VControllerToRelease.view removeFromSuperview]; 
} 

Вы можете нажать на книжный из ландшафтного режима, как это с помощью метода выше

PortraitViewController *portraitVC=[[PortraitViewController alloc]initWithNibName:@"PortraitViewController" bundle:nil]; 

    [Switch loadController:portraitVC andRelease:self]; 

При диспетчерском режиме для наблюдения за поверхностью м.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [email protected]"Landscape"; 
    appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    appDelegate.navigationController.navigationBarHidden = NO; 
    if (IOS_OLDER_THAN_6) 
     [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO]; 
    // Do any additional setup after loading the view from its nib. 
} 

#ifdef IOS_NEWER_OR_EQUAL_TO_6 

-(BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations  
{ 
    return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft; 
} 

#endif 
0

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

Я нашел следующее решение в FAQ: iPhone Landscape FAQ and Solutions

Ключевым моментом этой идеи является то, что устройство может быть принужден к определенной ориентации только одним способом: 1. Установите ориентацию STAUS бар. 2. Представьте любой контроллер вида(), который поддерживает целевую ориентацию.

Что ж, вы не хотите представить что-либо модно? Не волнуйтесь. Ничто не останавливает вас от ... 3. мгновенно отклоняя этот контроллер вида, как только он был представлен. Это не будет видно пользователю, когда вы это сделаете. Но как только это будет сделано, ваше устройство останется в этой самой ориентации. 4. Нажмите контроллер вида, который вы хотите отобразить или даже перейдите к нему, если вы используете раскадровки.

Для меня это единственное работоспособное решение. Помимо этого ответа в FAQ, все остальное должно быть установлено правильно. Поддерживаемые ориентации устройств для полного проекта должны быть в основном все. Поддерживаемыми ориентациями для каждого вида contrellr должны быть те, которые поддерживают каждый просмотр, и shouldAutoRotate должны возвращать YES. Это сложнее, если задействован контроллер панели вкладок. Вернитесь ко мне, если ваше приложение основано на панели вкладок.