美文网首页运行时
获取设备朝向&监听设备朝向

获取设备朝向&监听设备朝向

作者: ShenYj | 来源:发表于2016-08-03 13:26 被阅读428次

    UIDeviceOrientation枚举值:

        UIDeviceOrientationUnknown,
        UIDeviceOrientationPortrait,            // 竖向-home键在下
        UIDeviceOrientationPortraitUpsideDown,  // 竖向-home键在上
        UIDeviceOrientationLandscapeLeft,       // 横向-home键在左
        UIDeviceOrientationFaceDown             // 横向-home键在右
        UIDeviceOrientationFaceUp,              // 平放-朝上
        UIDeviceOrientationFaceDown             // 平放-朝下
    
    
    • 1 主动获取朝向
    //主动生成设备朝向的通知  使用时注意该方法有延迟,调用后立即获取朝向无法正常获取
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        
        //获取设备朝向 必须生成设备朝向的通知
        NSLog(@"%zd", [UIDevice currentDevice].orientation);
    });
    
    
    • 2 监听朝向变化
    //监听朝向变化  通过监听通知来实现  UIDeviceOrientationDidChangeNotification 当朝向发生变化后调用监听通知的响应方法,一旦开启监听,默认就会调用一次响应方法
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationDidChange) name:UIDeviceOrientationDidChangeNotification object:nil];
    
    

    监听设备朝向变化时调用的方法,只要设备朝向一发生改变,就能实时获取朝向了

    //朝向发生变化后调用
    - (void)orientationDidChange{
        //监听横竖屏变化  根据横竖屏情况设置不同的主视图宽度
        if (UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)) { //竖向
            
            //设置主视图的最大宽度
            self.maximumPrimaryColumnWidth = 60;
        } else { //横向
            //设置主视图的最大宽度
            self.maximumPrimaryColumnWidth = 200;
        }
    }
    

    示例代码:

    #import "JSSplitViewController.h"
    
    @interface JSSplitViewController ()
    
    @end
    
    @implementation JSSplitViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        [self prepareSplitViewController];
        
    }
    
    // 设置SplitViewController
    - (void)prepareSplitViewController {
        
        // 设置SplitViewController显示模式:主视图和明细视图始终显示
        self.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
    
        // 监听设备朝向变化
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationDidChangeNotification) name:UIDeviceOrientationDidChangeNotification object:nil];
    
    }
    
    // 监听设备朝向变化时调用的方法
    - (void)orientationDidChangeNotification{
    
        // 根据横竖屏变化,设置不同的主视图宽度
        if (UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)) { // 竖屏
    
            self.maximumPrimaryColumnWidth = 60;    
        }else { // 横向
            
            self.maximumPrimaryColumnWidth = 200;   
        }
        
    }
    @end
    

    当设备旋转时,竖屏下,让主视图的宽度为60;横屏下,主视图宽度为200

    横屏:

    horizontal.png

    竖屏:

    vertical.png

    判断横竖屏时,使用了系统提供的一个内联函数,通过这个函数,直接帮我们完成了朝向的判断,这样就简单实现了判断,免去了自己判断

    static inline BOOL UIDeviceOrientationIsPortrait(UIDeviceOrientation orientation)  __TVOS_PROHIBITED {
        return ((orientation) == UIDeviceOrientationPortrait || (orientation) == UIDeviceOrientationPortraitUpsideDown);
    }
    
    static inline BOOL UIDeviceOrientationIsLandscape(UIDeviceOrientation orientation)  __TVOS_PROHIBITED {
        return ((orientation) == UIDeviceOrientationLandscapeLeft || (orientation) == UIDeviceOrientationLandscapeRight);
    }
    

    相关文章

      网友评论

        本文标题:获取设备朝向&监听设备朝向

        本文链接:https://www.haomeiwen.com/subject/tamqsttx.html