iOS 横竖屏适配 笔记

 研究消息转发机制 已经一周多了,但是 还是没整理出博客, 还是先写一个 项目中遇到的 横竖屏适配问题。

// 开启自动转屏
- (BOOL)shouldAutorotate {
    return YES;
}
// 设备支持方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll;
}
// 默认方向 
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationPortrait;
  }

 如果是RootViewController,上面这三行是足够。 

 如果需要强制横屏,那么就需要在 -(void)viewDidLoad 中调用下面的方法;如果自动转屏是 NO, 那么这个方法不调用

- (void)setInterfaceOrientation:(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;
        [invocation setArgument:&val atIndex:2];
        [invocation invoke];
    }
}

 

如果横屏启动后,发现 有半个屏幕黑屏, 那么 你就需要使用XCode 查看UI 屏幕方向,如果屏幕是横的,那么你就需要把视图适配一个横屏的。

在 转屏的回调中设置 适配

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    
    if (size.width > size.height) { // 横屏
        // 横屏布局 
    } else {
        // 竖屏布局 
    }
}

或者

- (void)layoutSubviews {
    [super layoutSubviews];
    // 通过状态栏电池图标来判断屏幕方向
    if ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationMaskPortrait) {
        // 竖屏适配
    } else {
        // 横屏适配
    }
}

 强制横屏启动

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [application setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];
    [window addSubview:EC_CAST(UIView,splashView)];
    [window makeKeyAndVisible];
    return YES;

posted @ 2017-10-27 17:47  大发写字的地方  阅读(500)  评论(0编辑  收藏  举报