zoukankan      html  css  js  c++  java
  • iOS强制横屏或强制竖屏

    原文链接 https://www.jianshu.com/p/d6cb54d2eaa1
    亲测第二种我这边是阔以滴

    第一种解决方案(不推荐,直接跳过看第二种解决方案):

    //强制转屏
    - (void)interfaceOrientation:(UIInterfaceOrientation)orientation
    {
        if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
            SEL selector  = NSSelectorFromString(@"setOrientation:");
            NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
            [invocation setSelector:selector];
            [invocation setTarget:[UIDevice currentDevice]];
            int val = orientation;
            // 从2开始是因为0 1 两个参数已经被selector和target占用
            [invocation setArgument:&val atIndex:2];
            [invocation invoke];
        }
    }
    

    强制横屏:

    [self interfaceOrientation:UIInterfaceOrientationLandscapeRight];
    

    强制竖屏:

    [self interfaceOrientation:UIInterfaceOrientationPortrait];
    

    只在某一个界面提供转屏的解决方法如下AppDelegate.m下操作

    -(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
        
        NSLog(@"0000000---------%@",NSStringFromClass([[self topViewController] class]));
        if ([NSStringFromClass([[self topViewController] class]) isEqualToString:@"想要提供转屏的控制器的名字"]) {
          //横屏
            return UIInterfaceOrientationMaskLandscapeRight;
        }
          //竖屏
        return UIInterfaceOrientationMaskPortrait;
    }
    //获取界面最上层的控制器
    - (UIViewController*)topViewController {
        return [self topViewControllerWithRootViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
    }
    //一层一层的进行查找判断
    - (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController {
        if ([rootViewController isKindOfClass:[UITabBarController class]]) {
            UITabBarController* tabBarController = (UITabBarController*)rootViewController;
            return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
        } else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
            UINavigationController* nav = (UINavigationController*)rootViewController;
            return [self topViewControllerWithRootViewController:nav.visibleViewController];
        } else if (rootViewController.presentedViewController) {
            UIViewController* presentedViewController = rootViewController.presentedViewController;
            return [self topViewControllerWithRootViewController:presentedViewController];
        } else {
            return rootViewController;
        }
    }
    

    如果你的应用的根控制器是Nav就把下面这段代码放到Nav根控制器下,如果是TabVC放到TabVC的下面

    - (BOOL)shouldAutorotate{
        return YES;
    }
    - (UIInterfaceOrientationMask)supportedInterfaceOrientations{
        return UIInterfaceOrientationMaskPortrait;
    }
    

    然后在你想横屏的控制器加上这段代码,基本上横屏问题就可以搞定了,前提是你的这个控制器是moda出来的,如果是push的话就要使用上文提到的强制横竖屏的方法,下面这段代码是不起作用的

    - (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
        return (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight);
    }
    
    - (UIInterfaceOrientationMask)supportedInterfaceOrientations {
        return UIInterfaceOrientationMaskLandscapeRight;
    }
    

    第二种解决方案:

    灵活设置横竖屏,不用区分Push还是Present,都是可以设置。

    第一步:

    在AppDelegate.h中添加旋转属性
    
    /**
     * 是否允许转向
     */
    @property(nonatomic,assign)BOOL allowRotation;
    
    在AppDelegate.m中添加转屏的代理方法
    
    - (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window
    
    {
        
        if (self.allowRotation == YES) {
            //横屏
            return UIInterfaceOrientationMaskLandscape;
            
        }else{
            //竖屏
            return UIInterfaceOrientationMaskPortrait;
            
        }
        
    }
    

    第二步:

    设置横竖屏的核心方法,我是直接把这个方法添加到了UIDevice的分类中,代码如下:

    • UIDevice+TFDevice.h :
    #import <UIKit/UIKit.h>
    @interface UIDevice (TFDevice)
    /**
     * @interfaceOrientation 输入要强制转屏的方向
     */
    + (void)switchNewOrientation:(UIInterfaceOrientation)interfaceOrientation;
    @end
    
    • UIDevice+TFDevice.m :
    #import "UIDevice+TFDevice.h"
    
    @implementation UIDevice (TFDevice)
    
    + (void)switchNewOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
            
            NSNumber *resetOrientationTarget = [NSNumber numberWithInt:UIInterfaceOrientationUnknown];
            
            [[UIDevice currentDevice] setValue:resetOrientationTarget forKey:@"orientation"];
            
            NSNumber *orientationTarget = [NSNumber numberWithInt:interfaceOrientation];
            
            [[UIDevice currentDevice] setValue:orientationTarget forKey:@"orientation"];
        
    }
    @end
    

    第三步:

    在需要设置横屏的控制器的ViewDidLoad中添加下面代码:

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        AppDelegate * appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
        //允许转成横屏
        appDelegate.allowRotation = YES;
        //调用横屏代码
        [UIDevice switchNewOrientation:UIInterfaceOrientationLandscapeRight];
    }
    

    第四步 (针对Push出的控制器来说):

    需要注意的是push过去的时候变成横屏,pop出去的时候在设置竖屏,此时最好禁用系统的侧滑返回手势。

    -(void)viewWillAppear:(BOOL)animated{
        [super viewWillAppear:animated];
        //禁用侧滑手势方法
        self.navigationController.interactivePopGestureRecognizer.enabled = NO;
    }
    -(void)viewWillDisappear:(BOOL)animated{
        [super viewWillDisappear:animated];
        //禁用侧滑手势方法
        self.navigationController.interactivePopGestureRecognizer.enabled = YES;
    }
    

    第五步:

    push控制器:

    //点击导航栏返回按钮的时候调用,所以Push出的控制器最好禁用侧滑手势:
    AppDelegate * appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    appDelegate.allowRotation = NO;//关闭横屏仅允许竖屏
    //切换到竖屏
    [UIDevice switchNewOrientation:UIInterfaceOrientationPortrait];
       
    [self.navigationController popViewControllerAnimated:YES];
    

    present控制器:

    AppDelegate * appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    appDelegate.allowRotation = NO;//关闭横屏仅允许竖屏
    //切换到竖屏
    [UIDevice switchNewOrientation:UIInterfaceOrientationPortrait];
        
    [self dismissViewControllerAnimated:YES completion:nil];
    

    第六步: 上图

  • 相关阅读:
    mysql分表场景分析与简单分表操作
    Linux内嵌汇编
    window 和 linux x64差别
    sourcetree和gitlab配置图解
    QT如何管理组件(解决“要继续此操作,至少需要一个有效且已启用的储存库”问题)
    QT5.x应用在Mac OS X和Windows平台的发布过程
    python中读写二进制文件
    mysql分表的3种方法
    MySQL-C++封装类
    MySQL删除数据库时无响应解决办法
  • 原文地址:https://www.cnblogs.com/gchlcc/p/8420730.html
Copyright © 2011-2022 走看看