present 横屏逻辑很简单,但是有一个问题,在present新VC时,原VC导航栏会向上抖动,看起来效果不太好。于是一直希望能够通过push来避免这个抖动。
为了实现这个效果,尝试了两种方式:
方式一:假push ,实则依然使用present 来推出新VC ,方法也很简单,修改present动画就好。
CATransition *animation =[CATransition animation];
[animation setDuration:0.3];
[animation setType:kCATransitionMoveIn];
[animation setSubtype:kCATransitionFromBottom];
[[[[UIApplication sharedApplication]keyWindow]layer]addAnimation:animation forKey:nil];
[self presentViewController:nav animated:NO completion:nil];
不过这个过程中,会导致present过程中底部出现黑屏.
方式二:真push,在push的同时,强制旋转屏幕。
ViewController2 *dancingStepVC = [[ViewController2 alloc] init];
[self orientationToPortrait:UIInterfaceOrientationLandscapeLeft];
[self.navigationController pushViewController:dancingStepVC animated:YES];
最终方式二完美实现了想要的效果。
注意:如果app本身就支持各个方向的旋转,那么orientationToPortrait 方法使用起来很方便。
不过,通常app都是默认竖屏的。虽然在工程设置里,可能设置了支持某个方向的横屏:

但是,想要设置某个页面的指定屏幕方向,还需要对以下三个参数进行设定:
1、app 支持的旋转旋转方向;
appdelegate.m
-(UIInterfaceOrientationMask)application:(UIApplication*)application supportedInterfaceOrientationsForWindow:(UIWindow*)window
2、屏幕旋转页面的旋转方向
3、返回上一级页面时上一级页面原来的旋转方向
对于1,很好解决,在appdelegate.h 里设定一个Bool类型的标志位allowRotation,用来动态控制app支持的旋转方向
比如,常规页面下,仅仅支持竖屏,则allowRotation = YES;return 支持的旋转方向仅为:
UIInterfaceOrientationMaskLandscapeLeft
在非常规页面下,allowRotation = NO ;支持旋转方向 UIInterfaceOrientationMaskPortrait
对于2,3也很简单,就是对orientationToPortrait方法传参。
说了这么多,直接上干货:demo地址。
如果喜欢,请简书点击喜欢,如果觉着demo有用,欢迎star哦~
支付宝扫码领红包,小伙伴们,来来来,扫一扫,说不定领完红包支付的时候就多个鸡腿呢~
网友评论