UIViewController 没有跟着UIWindow一起旋转的原因分析

本文探讨了iOS应用中UIViewController视图无法随设备旋转的问题,分析了可能的原因,包括未实现shouldAutorotateToInterfaceOrientation方法、视图层级不当、过早释放视图、子视图控制器旋转方向不一致及初始化方法调用错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转发

对于iPhone app,UIViewController类提供了基本的视图管理模式。当设备改变方向的时候viewcontroller的视图会自动随之旋转的。如果视图和子视图的autoresizing属性设置是对的,这时候视图又没有随着设备一起旋转,可能是以下的原因:

1.view controller没有完成代理方法

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation;

也要实现了shouldAutorotateToInterfaceOrientation方法,同时shouldAutorotateToInterfaceOrientation方法要返回YES来支持所有的旋转方向

2.view controller的UIView属性嵌入在UIWindow中,并非是一个附加的viewcontroller

你可能会发现shouldAutorotateToInterfaceOrientation方法只会在viewcontroller启动的时候被调用,不会因为设置的旋转而在被调用。这是因为viewcontroller束缚着他们所管理的视图,view controller是用来处理时间的响应链的一部分。viewcontroller是从UIResponder继承而来,同时他被插入到他所管理的视图和他的superview之间。因此,通常的做法是在你的app中有一个主viewcontroller来作为响应链的一部分。通常来说会添加一个主viewcontroller,例如UINavigationController,UITabBarController或者UIViewController到UIWindow上。

例如

[myWindowaddSubview:primaryViewController.view]; 如果你添加了另外一个viewcontroller的UIView属性到UIWindow(anotherController和主viewcontroller在同一个等级上)[myWindowaddSubview:anotherController.view];anotherController将不会接受旋转事件,只有第一个viewcontroller(primaryViewController)会接受旋转事件。

3.你添加了viewcontroller的UIView属性到UIWindow作为subview,但是过早的release它。UIWindow会retain视图,而不是viewcontroller。你不能过早的release他。在UIApplicationDelegate子类中定义他为retain属性。

4.在UITabBarController或者UINavigationController中的子viewcontroller没有对同一方向的支持。为了确保所有的子view controller旋转正确,你的每一个viewcontroller,每一个tab或者额navigation都要完成shouldAutorotateToInterfaceOrientation,而且必须支持对于同一方向的旋转,也就是说对于同一方向的位置要返回为YES。

5.重写-(id)init:或者-(id)initWithNibName:(NSString *)nibName bundle:(NSBundle*)nibBundle 方法的时候没有调用super。对于对象的初始化,在你的viewcontroller的init或者initWithNibName方法中必须要调用super。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值