我有一个应用程序,其中标签栏控制器有3个标签,每个标签都有一个视图控制器。 视图控制器1和2仅支持纵向模式,但选项卡3中的视图控制器支持所有方向 - 横向,横向左侧,横向右侧和纵向上下颠倒。 对于选项卡3,我们必须在设备处于纵向模式时显示特定视图,而在设备处于横向模式时显示另一个视图。
如果设备处于纵向模式且用户单击选项卡3,则在纵向模式下正确加载视图,然后如果我们将设备旋转到横向模式,则正确加载横向视图。
但是我们在标签1中将设备转为横向模式,然后单击标签3,然后出现问题,然后显示屏幕以横向模式显示,但它将其显示为纵向视图。 / p>
当我试图通过NSLogging
在委托方法中找出原因时(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
interfaceOrientation的值为1,即UIInterfaceOrientationPortrait 并且控件进入为纵向模式写入的if条件
if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){
当我尝试在同一委托方法中打印UIDevice方向的值时
UIDeviceOrientation interfaceOrientation = [UIDevice currentDevice].orientation;
NSLog(@" device orientation %u", interfaceOrientation);
控制台中打印的值为4,即UIDeviceOrientationLandscapeRight。
因此界面方向是UIInterfaceOrientationPortrait,但设备方向是UIDeviceOrientationLandscapeRight。
还有一件事,现在如果我将设备旋转到纵向模式,然后移动到横向模式,则会显示正确的横向视图,并且应用程序开始正常运行。
所以问题是如果我在横向模式下加载标签3它无法正确加载 但如果我们进入纵向模式,然后旋转到横向,如果从那里工作正常。
如果有人能提出一些有用的建议,为什么这样的行为会非常有益。
由于
答案 0 :(得分:1)
将这些行添加到Tab1& viewWillAppear方法中的Tab2,
#import <objc/message.h>
- (void)viewWillAppear:(BOOL)animated {
if(UIDeviceOrientationIsLandscape(self.interfaceOrientation)){
if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationPortrait );
}
}
}
答案 1 :(得分:0)
使用UITabBarController的子类创建CustomTabBarController类(例如:CustomTabBarController)
@interface CustomTabBarController : UITabBarController
将以下行添加到此类:
- (BOOL)shouldAutorotate
{
return [self.selectedViewController shouldAutorotate];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
return [self.selectedViewController shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
}
- (NSUInteger)supportedInterfaceOrientations
{
return [self.selectedViewController supportedInterfaceOrientations];
}
在你的app delegate或初始化UITabBarController的地方,用CustomTabBarController实例替换这些实例。
self.tabBarController = [[[CustomTabBarController alloc] init] autorelease];
使用不同的视图控制器支持将线条添加到模型视图控制器:
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationMaskPortrait;
}
-(BOOL)shouldAutorotate {
return NO;
}