为了账号安全,请及时绑定邮箱和手机立即绑定

支持多种方向的最简单方法?当应用程序处于横向模式时,如何加载自定义NIB?

支持多种方向的最简单方法?当应用程序处于横向模式时,如何加载自定义NIB?

iOS
开心每一天1111 2019-11-07 10:21:26
我有一个想要支持多种方向的应用程序。我有两个要使用的.xib文件myViewController.xib,它们myViewControllerLandscape.xib. myViewController.xib存在于project / Resources中,并且myViewControllerLandscape.xib存在于根项目目录中。我想做的是使用单独的NIB (myViewControllerLandscape.xib)进行旋转。我尝试在viewDidLoad like中检测旋转:if((self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (self.interfaceOrientation == UIInterfaceOrientationLandscapeRight)) {  NSLog(@"Landscape detected!");  [self initWithNibName:@"myViewControllerLandscape" bundle:nil]; }但是我可以在gdb中看到,当应用程序在横向设备上启动时,这不会执行。NSLog消息不会触发。为什么是这样?我做错了什么?另外,如果我将initWithNibName函数调用显式放入viewDidLoad方法中,则该nib不会加载,并继续显示myViewController.xib文件。我的电话怎么了?我应该指定捆绑商品吗?谢谢!
查看完整描述

3 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

您必须加载一个视图,然后检查方向并在需要时加载另一个视图。shouldAutorotateToInterfaceOrientation:如果要旋转,则返回“是”来检查方向。


我使用导航控制器来管理过渡。如果我具有人像视图并且设备旋转,则我推动风景视图,然后在返回肖像时弹出风景视图。


编辑:


我应该在shouldAutorotateToInterfaceOrientation中为所有方向返回YES,但是在应用启动时会调用此方法吗?您是否将视图推入此功能?


方向常数不是您查询的全局变量,而是系统发送给控制器的消息的一部分。因此,在加载视图控制器之前,您无法轻松检测方向。相反,您可以硬接线该应用程序,使其以特定的方向(通常是纵向)开始,然后立即旋转。(请参阅移动Safari。它始终以纵向开始,然后旋转为横向。)


这是我用来交换人像和风景视图的两种方法。


所有三个视图控制器都具有此方法:


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    // Return YES for supported orientations

    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);

}

肖像有:


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


    if (toInterfaceOrientation==UIInterfaceOrientationLandscapeRight) {

        [self.nav pushViewController:rightLVC animated:NO];

    }

    if (toInterfaceOrientation==UIInterfaceOrientationLandscapeLeft) {

        [self.nav pushViewController:leftLVC animated:NO];

    }

}

每个景观控制器具有以下功能:


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


    if (toInterfaceOrientation==UIInterfaceOrientationPortrait) {

        [self.nav popViewControllerAnimated:NO];

    }

该应用程序以纵向启动。如果设备的方向为横向,则按适当的横向。当设备旋转回纵向时,它将弹出风景。对于用户而言,它看起来像是同一视图将其自身重组为不同的方向。


查看完整回答
反对 回复 2019-11-07
?
森栏

TA贡献1810条经验 获得超5个赞

我稍加修改,以允许在肖像或风景中初步装入笔尖


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

    if( !nibNameOrNil )     nibNameOrNil = [self nibNameRotated:[[UIApplication sharedApplication] statusBarOrientation]];

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    return self;

}


- (NSString*) nibNameRotated:(UIInterfaceOrientation)orientation

{

    if( UIInterfaceOrientationIsLandscape(orientation))     return [NSString stringWithFormat:@"%@-landscape", NSStringFromClass([self class])];

    return [NSString stringWithFormat:@"%@", NSStringFromClass([self class])];

}


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

{

    NSString *nibname = [self nibNameRotated:toInterfaceOrientation];

    [[NSBundle mainBundle] loadNibNamed:nibname owner:self options:nil];

    [self viewDidLoad];

}


查看完整回答
反对 回复 2019-11-07
  • 3 回答
  • 0 关注
  • 504 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信