横竖屏管理,app让个别分界面横屏

app让个别分界面横屏,别的的为竖屏,化解如下

澳门葡京备用网址 1

APP设置里面,一定要设置可以旋转的趋势

appdelegate里面重新系统方向代理

func application(application: UIApplication,
supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask
{

 

        return
UIInterfaceOrientationMask.Portrait  //
设置任何为竖屏

    }

在想要完成横屏的controller里面重写

是否补助电动横屏,

横竖屏管理,app让个别分界面横屏。override func shouldAutorotate() -> Bool {

        return false

    }

 协助的可行性

    override func supportedInterfaceOrientations() ->
UIInterfaceOrientationMask
{

         

        return UIInterfaceOrientationMask.Landscape  //
代表横屏,左右横屏

    }

大要显示器幕,将要显示显示器方向

    override func
preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation
{

        

            return
UIInterfaceOrientation.LandscapeLeft

    }

 

若果此controller含nav,应该在nav里面重写这么些点子,controller不要求写

 

app让个别分界面横屏,别的的为竖屏,消除如下

澳门葡京备用网址 2

APP设置里面,一定要安装能够旋转的自由化

appdelegate里面重新系统方向代理

func application(application: UIApplication,
supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask
{

 

        return
UIInterfaceOrientationMask.Portrait  //
设置任何为竖屏

    }

在想要达成横屏的controller里面重写

是还是不是帮忙活动横屏,

override func shouldAutorotate() -> Bool {

        return false

    }

 援救的主旋律

    override func supportedInterfaceOrientations() ->
UIInterfaceOrientationMask
{

         

        return UIInterfaceOrientationMask.Landscape  //
代表横屏,左右横屏

    }

物理显示器幕,将在显示屏幕方向

    override func
preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation
{

        

            return
UIInterfaceOrientation.LandscapeLeft

    }

 

若是此controller含nav,应该在nav里面重写那么些艺术,controller不需求写

 

第一步

牛B的swift荧屏旋转经验终结者(OC统1思路)

1、AppDelegate

(1)定义变量 var blockRotation: Bool = false

(二)定义方法

Swift代码

func application(application: UIApplication,
supportedInterfaceOrientationsForWindow window: UIWindow?) ->
UIInterfaceOrientationMask {
  if self.blockRotation{
    return UIInterfaceOrientationMask.All
  } else {
    return UIInterfaceOrientationMask.Portrait
  }
}

 

二、要横屏的viewController

(1)获取变量

  let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

(2)在viewDidLoad中修改blockRotation变量值

  override func viewDidLoad() {   

       super.viewDidLoad()       

    appDelegate.blockRotation = true         

 } 

(3)view威尔Appear 设置页面横屏

override func viewWillAppear(animated: Bool) {  

       let value = UIInterfaceOrientation.LandscapeLeft.rawValue  

       UIDevice.currentDevice().setValue(value, forKey: “orientation”)  

}

(四)view威尔Disappear设置页面转回竖屏

override func viewWillDisappear(animated: Bool) {  

       appDelegate.blockRotation = false  

       let value = UIInterfaceOrientation.Portrait.rawValue  

       UIDevice.currentDevice().setValue(value, forKey: “orientation”)  

}  

(5)横屏页面是还是不是辅助旋转

// 是还是不是帮忙活动横屏。看档期的顺序可调,能够设置为true

override func shouldAutorotate() -> Bool {  

       return false  

}

经验总结:

地点意况是一个分界面竖屏跳转到第三个横屏分界面。

亟待贰个分界面能够竖屏,然后想竖屏播放器那样突然来个横屏,怎么办,接下去正是加大招了:

给想要横屏也许竖屏调用上边的动作。

// MARK: – 横屏

    func hengp()
{

        appDelegate.blockRotation = true

        let value =
UIInterfaceOrientation.LandscapeLeft.rawValue

        UIDevice.currentDevice().setValue(value, forKey: “orientation”)

    }

    // MARK: – 竖屏

    func shup()
{

        appDelegate.blockRotation = false

        let value =
UIInterfaceOrientation.Portrait.rawValue

        UIDevice.currentDevice().setValue(value, forKey: “orientation”)

    }

 

// 就要发生旋转就接触代理

override func willRotateToInterfaceOrientation(toInterfaceOrientation:
UIInterfaceOrientation, duration:
NSTimeInterval)
{

        

    }

//
旋转完毕触发代理。我们要求在此间对须要的分界面设置双重布局

    override func
didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation)
{

  //
获取当前手提式有线电话机物理状态的显示器形式,看看是横屏仍旧竖屏.

        let
interfaceOrientation = UIApplication.sharedApplication().statusBarOrientation

        if(interfaceOrientation == UIInterfaceOrientation.Portrait)

        {

            //当前是在竖屏情势

            print(“竖屏”)

             

        }else{ 

     //当前是在横屏格局

              self.theWebView?.frame = self.view.frame

        }

    }

难忘:横屏后,和竖屏前的宽中度值是会变的,借使你有缓存保存了宽中度值,在那种状况下,横屏后获得到在此在此以前竖屏的保存的宽中度值,一定要双重赢得,

  let bWidth = CGRectGetWidth(UIScreen.mainScreen().bounds)     ///<    屏幕宽度

     let bHeight =
CGRectGetHeight(UIScreen.mainScreen().bounds)  ///<    荧屏中度

 

 

率先保障工程支撑横竖屏 不多说看图

有限支撑圈红的地点 打对勾

58F678EC-EABC-4320-9FCB-F72BA617AFB5.png

第二步:

分三种状态

第一种:

你的window的rootViewController是一个UITabBarController

那时候你就必要创设三个 承接自 UITabBarController
的YourProjectTabBarController

然后在你的YourProjectTabBarController.m里增添如下的多个法子

OC实现

//是还是不是跟随荧屏旋转

-(BOOL)shouldAutorotate{

return self.selectedViewController.shouldAutorotate;

}

//支持旋转的大势有如何

-(UIInterfaceOrientationMask)supportedInterfaceOrientations{

return [self.selectedViewController supportedInterfaceOrientations];

}

//调节 vc present进来的横竖屏和进入方向
,补助的团团转方向必须包罗改再次来到值的可行性 (详细的印证见下文)

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{

return [self.selectedViewController
preferredInterfaceOrientationForPresentation]澳门葡京备用网址 ,;

}

Swift实现

//是或不是跟随显示屏旋转

override func shouldAutorotate() -> Bool {

return (selectedViewController?.shouldAutorotate())!

}

//帮忙旋转的方向有啥样

override func supportedInterfaceOrientations() ->
UIInterfaceOrientationMask {

return (selectedViewController?.supportedInterfaceOrientations())!

}

//调节 vc present进来的横竖屏和进入方向
,协理的团团转方向必须包蕴改重返值的大方向 (详细的认证见下文)

override func preferredInterfaceOrientationForPresentation() ->
UIInterfaceOrientation {

return
(selectedViewController?.preferredInterfaceOrientationForPresentation())!

}

壹旦YourProjectTabBarController 里装载的视图 又是那种布局的

OC举例

UIViewController * vc1 = [[UIViewController alloc]init];

BaseNavigationViewController * nvc1 = [[BaseNavigationViewController
alloc]initWithRootViewController:vc1];

UIViewController * vc2 = [[UIViewController alloc]init];

BaseNavigationViewController * nvc2 = [[BaseNavigationViewController
alloc]initWithRootViewController:vc2];

UIViewController * vc3 = [[UIViewController alloc]init];

BaseNavigationViewController * nvc3 = [[BaseNavigationViewController
alloc]initWithRootViewController:vc3];

self.viewControllers = @[nvc1,nvc2,nvc3];

Swift举例

let vc1  = UIViewController()

let nvc1 = BaseNavigationViewController(rootViewController: vc1)

let vc2  = UIViewController()

let nvc2 = BaseNavigationViewController(rootViewController: vc2)

let vc3  = UIViewController()

let nvc3 = BaseNavigationViewController(rootViewController: vc3)

viewControllers = [nvc1, nvc2, nvc3]


tabbarController的viewControllers里放的是导航栏视图而不是见仁见智的UIViewController

那时候你须求创立1个连任自UINavigationController
的YourProjectNavigationController

下一场在你的YourProjectNavigationController.m里增多如下的多少个形式

OC实现

-(BOOL)shouldAutorotate{

return self.topViewController.shouldAutorotate;

}

-(UIInterfaceOrientationMask)supportedInterfaceOrientations{

return [self.topViewController supportedInterfaceOrientations];

}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{

return [self.topViewController
preferredInterfaceOrientationForPresentation];

}

Swift实现

override func shouldAutorotate() -> Bool {

return (topViewController?.shouldAutorotate())!

}

override func supportedInterfaceOrientations() ->
UIInterfaceOrientationMask {

return (topViewController?.supportedInterfaceOrientations())!

}

override func preferredInterfaceOrientationForPresentation() ->
UIInterfaceOrientation {

return
(topViewController?.preferredInterfaceOrientationForPresentation())!

}

仔细看和上边YourProjectTabBarController里的依然有分别的。

一个是  self.selectedViewController 一个是 self.topViewController

接下去就足以操纵每多个Controller的是还是不是能够旋转了(前提
“iphone的竖排方向锁定” 是关闭的场地)

在需求旋转的controller里增加如下方法

OC实现

//是还是不是旋转

-(BOOL)shouldAutorotate{

return YES;

}

//帮衬的动向

– (UIInterfaceOrientationMask)supportedInterfaceOrientations {

return UIInterfaceOrientationMaskAll;

}

Swift实现

override func shouldAutorotate() -> Bool {

return true

}

override func supportedInterfaceOrientations() ->
UIInterfaceOrientationMask {

return UIInterfaceOrientationMask.All

}

在不供给旋转的controller里加多如下方法

OC实现

//是还是不是旋转

-(BOOL)shouldAutorotate{

return NO;

}

//辅助的主旋律

– (UIInterfaceOrientationMask)supportedInterfaceOrientations {

return UIInterfaceOrientationMaskPortrait;

}

Swift实现

override func shouldAutorotate() -> Bool {

return false

}

override func supportedInterfaceOrientations() ->
UIInterfaceOrientationMask {

return UIInterfaceOrientationMask.Portrait

}

tips:有三个小建议你能够创设八个一而再自UIViewController的BaseViewController,然后您项目里创立的vc都承继自BaseViewController。你能够在BaseViewController
加多荧屏无法旋转的方法 ,那样创设的每3个vc都无法旋转。
然后,假设您供给旋转的时候,在vc里增加协助旋转的代码就好了。那样就省去了,纵然大许多vc不需求支持显示屏旋转,重复增添不接济旋转的代码了。

第2种情况:

你的window的rootViewController是一个UINavigationController

那种景况 你即便省去上边创制 继承自 UITabBarController
的YourProjectTabBarController的步子就能够了。

详见说下这一个措施

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{

return UIInterfaceOrientationPortrait;

}

共有伍个重临值

//该措施 只适用于 vc present 进入  不适用于 push

typedef NS_ENUM(NSInteger, UIInterfaceOrientation) {

UIInterfaceOrientationUnknown            //貌似没什么用

UIInterfaceOrientationPortrait          //vc 竖屏 从下  present 进入

UIInterfaceOrientationPortraitUpsideDown //vc 竖屏 从上  present 进入

UIInterfaceOrientationLandscapeLeft      //vc 横屏 从左  present 进入

UIInterfaceOrientationLandscapeRight    //vc 横屏 从又  present 进入

} __TVOS_PROHIBITED;

//这几个方法须要和底下的方法一同行使

– (UIInterfaceOrientationMask)supportedInterfaceOrientations {

return UIInterfaceOrientationMaskPortrait;

}

//匡助的团团转方向必须包括改再次回到值的大势 那句话的意味是:

举多少个例子

– (UIInterfaceOrientationMask)supportedInterfaceOrientations {

return UIInterfaceOrientationMaskPortrait; // 协助竖屏

}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{

return UIInterfaceOrientationLandscapeLeft; //却横屏进入

}

那样的组合会变成程序崩溃

– (UIInterfaceOrientationMask)supportedInterfaceOrientations {

return UIInterfaceOrientationMaskAll; // 辅助具有情形

}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{

return UIInterfaceOrientationLandscapeLeft; //横屏进入

}

– (UIInterfaceOrientationMask)supportedInterfaceOrientations {

return UIInterfaceOrientationMaskLandscape; // 扶助横屏状态

}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{

return UIInterfaceOrientationLandscapeLeft; //横屏进入

}

那二种就不会崩溃。

该方法首要用于,你日前处于竖屏状态然而你指望下两个页面是 横屏状态
的时候。且 “iphone的竖排方向锁定” 是或不是张开 不会影响该方法。

方法三:

而外上面包车型客车横竖屏方法还有另二个,不过某些跟上边1个方法的安装是同等的,比方方向设定.

// 强制转屏

– (void)setInterfaceOrientation:(UIInterfaceOrientation)orientation {

if([[UIDevicecurrentDevice]respondsToSelector:@selector(setOrientation:)])
{

SELselector=NSSelectorFromString(@”setOrientation:”);

NSInvocation*invocation =
[NSInvocationinvocationWithMethodSignature:[UIDeviceinstanceMethodSignatureForSelector:selector]];

[invocationsetSelector:selector];

[invocationsetTarget:[UIDevicecurrentDevice]];

// 从二始发是因为前七个参数已经被selector和target占用

[invocationsetArgument:&orientationatIndex:2];

[invocationinvoke];

}

}

艺术四:重新载入参数一下rootViewController,如此系统才会另行触发-
(UIInterfaceOrientationMask)supportedInterfaceOrientations {}等方法.

// hack, turn to landscape code.

UIWindow*mainWindow =
[[UIApplicationsharedApplication].delegatewindow];

UIViewController*root = mainWindow.rootViewController;

mainWindow.rootViewController=nil;

mainWindow.rootViewController= root;

if([rootisKindOfClass:[UITabBarControllerclass]]) {

UITabBarController*tab = (UITabBarController*)root;

NSIntegercurrentIdx = tab.selectedIndex;

[tabsetSelectedIndex:(currentIdx+1)%4];

[tabsetSelectedIndex:currentIdx];

}

总结:

对此方法三、肆注意事项:应用在横屏进入后台时,要谨防方向被涂改为竖屏。同时要注意在AppDelegate中安装要有个别类须要的趋向。此文第1步、第2部为转载的底下小编的内容,不不奇怪的,迎接研商:QQ:14016995陆七.

那篇小说作为基础知识依然很有参考价值的:http://www.jianshu.com/p/62431e148e68

转发注明:

作者:张梓辰

链接:http://www.jianshu.com/p/a2201f39b6a7

來源:简书

小说权归作者全体。商业转发请联系小编得到授权,非商业转发请表明出处。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website